Maven 编译器插件无法找到混合 (java-scala) 代码库的符号
Maven compiler plugin fails to find symbol for mixed (java-scala) codebase
我在一个项目的同一个文件夹中有一个 java 的代码库和 scala 文件(总共 5 个文件)。几个 java 文件引用一个 scala 文件定义的 class。我使用 scala-maven-plugin (v3.2.2) 来编译源代码。当尝试使用最新的 mvn-compiler-plugin (v3.5.1) 时,即使 scala 编译器首先运行并编译所有文件(java 和 scala),maven-compiler-plugin 稍后启动,尝试仅编译 java 文件,并失败并显示一条消息:找不到符号 - 对于在 scala 文件中定义的对象。
这是一些输出。
[INFO] --- maven-clean-plugin:2.5:clean (default-clean) @ GraphDB ---
[INFO] Deleting /home/xx/GraphDB
[INFO]
[INFO] --- scala-maven-plugin:3.2.2:compile (default-cli) @ GraphDB ---
[INFO] /media/xx/GraphDB/src/main/java:-1: info: compiling
[INFO] Compiling 5 source files to /home/xx/GraphDB/classes at 1465363494733
[INFO] prepare-compile in 0 s
[INFO] compile in 4 s
[INFO]
[INFO] --- maven-resources-plugin:2.6:resources (default-resources) @ GraphDB ---
[WARNING] Using platform encoding (UTF-8 actually) to copy filtered resources, i.e. build is platform dependent!
[INFO] Copying 1 resource
[INFO]
[INFO] --- maven-compiler-plugin:3.5.1:compile (default-compile) @ GraphDB ---
[INFO] Changes detected - recompiling the module!
[WARNING] File encoding has not been set, using platform encoding UTF-8, i.e. build is platform dependent!
[INFO] Compiling 3 source files to /home/xx/GraphDB/classes
[INFO] -------------------------------------------------------------
[ERROR] COMPILATION ERROR :
[INFO] -------------------------------------------------------------
[ERROR] /media/xx/GraphDB/src/GraphTest.java:[23,30] cannot find symbol
symbol: variable TitanGraphProvider
location: class com.ilabs.dsi.titan.GraphTest
[ERROR] /media/xx/GraphDB/src/AddStatic.java:[229,24] cannot find symbol
symbol: variable TitanGraphProvider
location: class com.ilabs.dsi.titan.AddStatic
符号 "TitanGraphProvider" 在 scala 文件中。
我正在使用命令 "mvn clean scala:compile package" 来执行此操作。我注意到,如果我将命令分解为 "mvn clean scala:compile" 和 "mvn package",那么第一个命令会通过,但第二个命令会在同一步骤失败并出现相同的错误。似乎后面的 java 编译阶段是由包步骤启动的。
在这种情况下实现 mvn package 的正确方法是什么?
编辑: 看来我没有提供完整的场景。我试图从 Virtualbox VM 运行 Debian 上的共享文件夹编译代码库,底层文件系统是 Windows (10)。当我将文件夹移动到 VM 上的非共享位置时,一切正常。
确保你有:
<plugin>
<groupId>net.alchim31.maven</groupId>
<artifactId>scala-maven-plugin</artifactId>
<version>${scala-maven-plugin.version}</version>
<executions>
<execution>
<id>scala-compile-first</id>
<phase>process-resources</phase>
<goals>
<goal>add-source</goal>
<goal>compile</goal>
</goals>
</execution>
<execution>
<phase>compile</phase>
<goals>
<goal>compile</goal>
<goal>testCompile</goal>
</goals>
</execution>
</executions>
<configuration>
<scalaVersion>${scala.version}</scalaVersion>
</configuration>
</plugin>
我试图从 Virtualbox VM 运行 Debian 上的共享文件夹编译代码库,底层文件系统是 Windows (10)。当我将文件夹移动到 VM 上的非共享位置时,一切正常。
但是,我在编译一个由所有scala文件组成的项目时,上面的设置没有任何问题。不确定是什么原因,但至少这是我遇到的上述问题的解决方案。希望这对某人有所帮助。
我遇到了同样的问题。我通过确保在 Java 之前编译 Scala 源代码来修复它。在我的例子中,Java 代码可以被 Scala 取代,因此依赖关系是 Java -> Scala。这是我配置 scala-maven-plugin 的方式:
<plugin>
<groupId>net.alchim31.maven</groupId>
<artifactId>scala-maven-plugin</artifactId>
<version>3.3.1</version>
<executions>
<execution>
<id>scala-compile-first</id>
<phase>process-resources</phase>
<goals>
<goal>add-source</goal>
<goal>compile</goal>
</goals>
</execution>
<execution>
<goals>
<goal>testCompile</goal>
</goals>
</execution>
</executions>
</plugin>
我有同样类型的错误,问题是关于 java 和 scala 文件之间的编译顺序:最后所有都编译为 .class 文件混合在同一个 folder/package 层次结构,但是首先编译 java 文件,然后是 scala 文件(因此 java 看不到 scala 代码),或者根据配置相反(参见其他回答有关此类配置的问题)。
因此,与此处的大多数答案相同的问题。但我有另一个解决方案:要不选择 scala 和 java 之间的顺序,您可以将 java 和 scala 文件都放在 scala src 文件夹中,即 src/main/scala/
。 scala 编译器在 scala-on-java 和 java-on-scala 两个方向编译并管理依赖关系。唯一的缺点是 java 文件位于 scala 文件夹中,但我个人并不介意。
我在一个项目的同一个文件夹中有一个 java 的代码库和 scala 文件(总共 5 个文件)。几个 java 文件引用一个 scala 文件定义的 class。我使用 scala-maven-plugin (v3.2.2) 来编译源代码。当尝试使用最新的 mvn-compiler-plugin (v3.5.1) 时,即使 scala 编译器首先运行并编译所有文件(java 和 scala),maven-compiler-plugin 稍后启动,尝试仅编译 java 文件,并失败并显示一条消息:找不到符号 - 对于在 scala 文件中定义的对象。
这是一些输出。
[INFO] --- maven-clean-plugin:2.5:clean (default-clean) @ GraphDB ---
[INFO] Deleting /home/xx/GraphDB
[INFO]
[INFO] --- scala-maven-plugin:3.2.2:compile (default-cli) @ GraphDB ---
[INFO] /media/xx/GraphDB/src/main/java:-1: info: compiling
[INFO] Compiling 5 source files to /home/xx/GraphDB/classes at 1465363494733
[INFO] prepare-compile in 0 s
[INFO] compile in 4 s
[INFO]
[INFO] --- maven-resources-plugin:2.6:resources (default-resources) @ GraphDB ---
[WARNING] Using platform encoding (UTF-8 actually) to copy filtered resources, i.e. build is platform dependent!
[INFO] Copying 1 resource
[INFO]
[INFO] --- maven-compiler-plugin:3.5.1:compile (default-compile) @ GraphDB ---
[INFO] Changes detected - recompiling the module!
[WARNING] File encoding has not been set, using platform encoding UTF-8, i.e. build is platform dependent!
[INFO] Compiling 3 source files to /home/xx/GraphDB/classes
[INFO] -------------------------------------------------------------
[ERROR] COMPILATION ERROR :
[INFO] -------------------------------------------------------------
[ERROR] /media/xx/GraphDB/src/GraphTest.java:[23,30] cannot find symbol
symbol: variable TitanGraphProvider
location: class com.ilabs.dsi.titan.GraphTest
[ERROR] /media/xx/GraphDB/src/AddStatic.java:[229,24] cannot find symbol
symbol: variable TitanGraphProvider
location: class com.ilabs.dsi.titan.AddStatic
符号 "TitanGraphProvider" 在 scala 文件中。
我正在使用命令 "mvn clean scala:compile package" 来执行此操作。我注意到,如果我将命令分解为 "mvn clean scala:compile" 和 "mvn package",那么第一个命令会通过,但第二个命令会在同一步骤失败并出现相同的错误。似乎后面的 java 编译阶段是由包步骤启动的。
在这种情况下实现 mvn package 的正确方法是什么?
编辑: 看来我没有提供完整的场景。我试图从 Virtualbox VM 运行 Debian 上的共享文件夹编译代码库,底层文件系统是 Windows (10)。当我将文件夹移动到 VM 上的非共享位置时,一切正常。
确保你有:
<plugin>
<groupId>net.alchim31.maven</groupId>
<artifactId>scala-maven-plugin</artifactId>
<version>${scala-maven-plugin.version}</version>
<executions>
<execution>
<id>scala-compile-first</id>
<phase>process-resources</phase>
<goals>
<goal>add-source</goal>
<goal>compile</goal>
</goals>
</execution>
<execution>
<phase>compile</phase>
<goals>
<goal>compile</goal>
<goal>testCompile</goal>
</goals>
</execution>
</executions>
<configuration>
<scalaVersion>${scala.version}</scalaVersion>
</configuration>
</plugin>
我试图从 Virtualbox VM 运行 Debian 上的共享文件夹编译代码库,底层文件系统是 Windows (10)。当我将文件夹移动到 VM 上的非共享位置时,一切正常。
但是,我在编译一个由所有scala文件组成的项目时,上面的设置没有任何问题。不确定是什么原因,但至少这是我遇到的上述问题的解决方案。希望这对某人有所帮助。
我遇到了同样的问题。我通过确保在 Java 之前编译 Scala 源代码来修复它。在我的例子中,Java 代码可以被 Scala 取代,因此依赖关系是 Java -> Scala。这是我配置 scala-maven-plugin 的方式:
<plugin>
<groupId>net.alchim31.maven</groupId>
<artifactId>scala-maven-plugin</artifactId>
<version>3.3.1</version>
<executions>
<execution>
<id>scala-compile-first</id>
<phase>process-resources</phase>
<goals>
<goal>add-source</goal>
<goal>compile</goal>
</goals>
</execution>
<execution>
<goals>
<goal>testCompile</goal>
</goals>
</execution>
</executions>
</plugin>
我有同样类型的错误,问题是关于 java 和 scala 文件之间的编译顺序:最后所有都编译为 .class 文件混合在同一个 folder/package 层次结构,但是首先编译 java 文件,然后是 scala 文件(因此 java 看不到 scala 代码),或者根据配置相反(参见其他回答有关此类配置的问题)。
因此,与此处的大多数答案相同的问题。但我有另一个解决方案:要不选择 scala 和 java 之间的顺序,您可以将 java 和 scala 文件都放在 scala src 文件夹中,即 src/main/scala/
。 scala 编译器在 scala-on-java 和 java-on-scala 两个方向编译并管理依赖关系。唯一的缺点是 java 文件位于 scala 文件夹中,但我个人并不介意。