Maven编译器插件无法找到混合(java-scala)代码库的符号

时间:2016-06-08 05:49:32

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

我在项目的同一文件夹中有一个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包的正确方法是什么?

编辑:看起来我没有提供完整的方案。我试图从运行Debian的Virtualbox VM上的共享文件夹编译代码库,底层文件系统是Windows(10)。当我将文件夹移动到VM上的非共享位置时,事情进展顺利。

4 个答案:

答案 0 :(得分: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>

答案 1 :(得分:0)

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

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

答案 2 :(得分:0)

我遇到了同样的问题。我已通过确保Scala源代码在Java之前进行编译来解决此问题。在我的情况下,可以认为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 :(得分:0)

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

因此,这里的问题与大多数答案相同。但是我有另一种解决方案:为了不选择scala和java之间的顺序,可以将java和scala文件都放在scala src文件夹中,即src/main/scala/。 scala编译器在java上的scala和scala上的两个方向上都进行编译和管理依赖项。唯一的权衡是可以在scala文件夹中找到java文件,但我个人不介意。