Я расширяю существующий проект тестирования производительности, который представляет собой проект Scala, использующий Gatling для моделирования и Maven в качестве инструмента сборки. Мне нужен Scalaj как новая зависимость. Я изменил версию Scala с 2.12.8
на 2.13.0
, чтобы использовать самую последнюю версию Scalaj (2.4.2
), и это привело к ошибке компиляции класса, который использует оператор /
из io.gatling.commons.util.PathHelper
.
Я получаю эту ошибку, только если запускаю проект с использованием конфигурации IntelliJ, но не запускаю mvn package
и mvn gatling:test
. Я также не получаю ошибку, если использую конфигурацию IntelliJ и Scala 2.12.8
.
Я подумал, что это может быть проблема совместимости, и проверил документацию Gatling и примечания к выпуску, но последнее, что они упомянул касались совместимости со Scala, заключалось в том, что из 2.3
на Gatling требуется Scala 2.12
. Я полагаю, это означает 2.12
или выше. Я ошибаюсь в этот момент?
Я также проверил, есть ли обновление для плагина IntelliJ Scala, но ничего не нашел.
Вот соответствующая часть моего файла pom.xml
:
<dependencies>
<dependency>
<groupId>io.gatling.highcharts</groupId>
<artifactId>gatling-charts-highcharts</artifactId>
<version>3.0.2</version>
<scope>test</scope>
</dependency>
<dependency>
<groupId>org.scala-lang</groupId>
<artifactId>scala-library</artifactId>
<version>2.13.0</version>
</dependency>
<!-- https://mvnrepository.com/artifact/org.scalaj/scalaj-http -->
<dependency>
<groupId>org.scalaj</groupId>
<artifactId>scalaj-http_2.13</artifactId>
<version>2.4.2</version>
</dependency>
</dependencies>
Класс, который не компилируется (где /
— функция из импортированного класса):
package com.example.mypackage
import io.gatling.commons.util.PathHelper._
object PathHelper {
val projectRootDir: Path = "root_directory"
val mavenSourcesDirectory: Path = projectRootDir / "src"
}
Пример точки входа:
package com.example.mypackage
object ApplicationRunner {
def main(args: Array[String]): Unit = {
println(mavenSourcesDirectory.toString)
}
}
Сообщение об ошибке, которое я получаю после того, как нажимаю кнопку «Выполнить» IntelliJ (я изменил некоторую нерелевантную информацию о проекте на комментарии между <>
):
Error:scalac: Error: assertion failed:
no extension method found for:
method /:(pathString: String)java.nio.file.Path
Candidates:
Candidates (signatures normalized):
"
while compiling: /home/me/example-repo/src/test/scala/com/example/mypackage/PathHelper.scala
during phase: globalPhase=erasure, enteringPhase=refchecks
library version: version 2.13.0
compiler version: version 2.13.0
reconstructed args: -classpath <.jar path for every dependency I use>
last tree to typer: Select(Apply(method to), foreach$mVc$sp)
tree position: <some line in an entirely different class where I don't use PathHelper>
tree tpe: (f: Int => Unit)Unit
symbol: (final override) method foreach$mVc$sp in class Range
symbol definition: final override def foreach$mVc$sp(f: Int => Unit): Unit (a MethodSymbol)
symbol package: scala.collection.immutable
symbol owners: method foreach$mVc$sp -> class Range
call site: object PathHelper in package mypackage in package mypackage
== Source file context for tree position ==
12 <line from file>
13 <line from file>
14 <tree position>
15 <line from file>
at scala.reflect.internal.SymbolTable.throwAssertionError(SymbolTable.scala:170)
at scala.tools.nsc.transform.ExtensionMethods.$anonfun$extensionMethod$1(ExtensionMethods.scala:54)
at scala.tools.nsc.transform.ExtensionMethods.extensionMethod(ExtensionMethods.scala:49)
at scala.tools.nsc.transform.Erasure$ErasureTransformer$$anon$4.preEraseNormalApply(Erasure.scala:1102)
at scala.tools.nsc.transform.Erasure$ErasureTransformer$$anon$4.preEraseApply(Erasure.scala:1204)
at scala.tools.nsc.transform.Erasure$ErasureTransformer$$anon$4.preErase(Erasure.scala:1214)
at scala.tools.nsc.transform.Erasure$ErasureTransformer$$anon$4.transform(Erasure.scala:1333)
at scala.tools.nsc.transform.Erasure$ErasureTransformer$$anon$4.transform(Erasure.scala:993)
at scala.reflect.internal.Trees$ValDef.$anonfun$transform$4(Trees.scala:405)
at scala.reflect.api.Trees$Transformer.atOwner(Trees.scala:2625)
<and so on for 78 more lines of stack trace>
В конце концов, для меня это похоже на проблему обработки зависимостей IntelliJ. Я уже нашел два обходных пути, поэтому эта проблема меня не убивает, но она неудобна, и мне интересно узнать, как ее исправить. Кроме того, я новичок в Scala, поэтому есть большая вероятность, что я что-то упустил.
Любое понимание будет оценено.
Сам не пробовал, но кажется, что Gatling еще не совместим со Scala 2.13:
https://github.com/gatling/gatling/issues/3566
Возможно, будет проще вернуться к версии 2.12.