【问题标题】:Maven compiler plugin fails to find symbol for mixed (java-scala) codebaseMaven 编译器插件无法找到混合(java-scala)代码库的符号
【发布时间】:2016-10-08 05:34:13
【问题描述】:

我在项目的同一文件夹中有一个 java 和 scala 文件的代码库(总共 5 个文件)。几个 java 文件是指一个由一个 scala 文件定义的类。我使用 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的正确实现方式是什么?

编辑:看起来我没有提供完整的场景。我试图从运行 Debian 的 Virtualbox VM 上的共享文件夹编译代码库,底层文件系统是 Windows (10)。当我将文件夹移动到 VM 上的非共享位置时,一切正常。

【问题讨论】:

    标签: java scala maven maven-3 maven-compiler-plugin


    【解决方案1】:

    确保你有:

                 <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>
    

    【讨论】:

    • 嗨 - 谢谢。我已经有相同的插件,并且有第二个 块(连同 config 块)。我在我的 pom 中添加了第一个 块并再次尝试,但这似乎没有帮助。我遇到了同样的错误。
    【解决方案2】:

    我也遇到了同样的问题。我通过确保在 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>
    

    【讨论】:

      【解决方案3】:

      我试图从运行 Debian 的 Virtualbox VM 上的共享文件夹编译代码库,底层文件系统是 Windows (10)。当我将文件夹移动到 VM 上的非共享位置时,一切正常。

      但是,在编译包含所有 scala 文件的项目时,上述设置没有任何问题。不知道给出了什么,但至少这是我遇到的上述问题的解决方案。希望这对某人有所帮助。

      【讨论】:

        【解决方案4】:

        我遇到了相同类型的错误,问题是关于 java 和 scala 文件之间的编译顺序:最后,所有文件都编译为 .class 文件,混合在同一个文件夹/包层次结构中,但是 java 文件都是首先编译,然后是 scala 的(因此 java 看不到 scala 代码),或者根据配置反过来(请参阅有关此类配置的其他答案)。

        因此,与此处的大多数答案相同。但我有另一个解决方案:不选择scala和java之间的顺序,你可以把java和scala文件都放在scala src文件夹中,即src/main/scala/。 scala 编译器编译并管理两个方向 scala-on-java 和 java-on-scala 的依赖关系。唯一的权衡是在 scala 文件夹中可以找到 java 文件,但我个人并不介意。

        【讨论】:

          猜你喜欢
          • 2014-08-18
          • 2016-06-21
          • 2020-06-16
          • 1970-01-01
          • 2012-08-24
          • 2018-06-02
          • 2019-05-31
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多