我正在尝试向现有企业项目添加 Maven 支持。这是一个多模块项目,前 2 个模块编译和打包没有问题,但我面临编译错误,我尝试在多个模块中使用相同的依赖项。 我的结构是:
> + parent
> - pom.xml
> - module-1
> - pom.xml
> - module-2 (Depends on module-1)
> - pom.xml
> - module-3
> - pom.xml (Depends on both modules 1 and 2)
我在 Eclipse 上打开了项目,没有显示任何错误。当我从父级运行
mvn clean install
时,它成功安装了模块 1 和 2,但在模块 3 上失败,并显示 package xxx.yyy does not exist
和 Cannot find symbol XXXYYY
。包 xxx.yyy 和符号 XXXYYY 位于一个 jar 内,该 jar 列在模块 2 和 3 的依赖项上。
由于两个模块都依赖于同一个 jar,我尝试仅添加对模块 2 的依赖关系,并且我相信模块 3 由于传递依赖关系应该看到它,但它看不到该包。所以我尝试将依赖项添加到模块 2 和 3 pom,但问题仍然存在。
我已经检查/尝试过这些:
mvn dependency:copy-dependencies
我的项目的唯一特殊性是模块 3 依赖于模块 2,并且依赖于模块 2 也依赖的库。
下面我粘贴了模块 2 和 3 中的 pom。由于公司政策,我更改了一些名称。
模块2
<project xmlns="http://maven.apache.org/POM/4.0.0" ... >
<modelVersion>4.0.0</modelVersion>
<parent>
<groupId>com.company</groupId>
<artifactId>parent</artifactId>
<version>0.0.1-SNAPSHOT</version>
</parent>
<artifactId>Module2</artifactId>
<dependencies>
<dependency>
<groupId>com.company</groupId>
<artifactId>Module1</artifactId>
<version>0.0.1-SNAPSHOT</version>
</dependency>
<dependency>
<groupId>com.company</groupId>
<artifactId>SharedArtifact</artifactId>
<version>1.1</version>
</dependency>
...
模块3
<project xmlns="http://maven.apache.org/POM/4.0.0" ... >
<modelVersion>4.0.0</modelVersion>
<parent>
<groupId>com.company</groupId>
<artifactId>parent</artifactId>
<version>0.0.1-SNAPSHOT</version>
</parent>
<artifactId>Module3</artifactId>
<dependencies>
<dependency>
<groupId>com.company</groupId>
<artifactId>Module2</artifactId>
<version>0.0.1-SNAPSHOT</version>
</dependency>
<!--<dependency>
<groupId>com.company</groupId>
<artifactId>SharedArtifact</artifactId>
<version>1.1</version>
</dependency>-->
...
看不到的包位于“SharedArtifact”内部。当我从 Module2 中删除依赖项时,它不会从“SharedArtifact”包中给出
package does not exist
错误。但随后它给出了 Module2 jar 中的 package does not exist
。
看起来依赖关系不知何故丢失了,因为 Module3 依赖于它们两者。
我正在使用 Java 1.6.0_29 和 Maven 3.0.5。而且我无法升级到Java 7,因为该项目需要Java 6。并且无法升级Maven,因为升级后的Maven仅适用于java 7及更高版本。
更新1:
我编译的时候报错如下:
[ERROR] COMPILATION ERROR :
[INFO] -------------------------------------------------------------
[ERROR] \Users\usuario\Documents\workspaces\myworkspace\qa\Module3\src\com\company\sharedartifact\package\SomeClass.java:[8,55]
package com.company.sharedartifact.package does not exist
[ERROR] \Users\usuario\Documents\workspaces\myworkspace\qa\Module3\src\com\company\sharedartifact\package\SomeClass.java:[9,55]
package com.company.sharedartifact.package does not exist
[ERROR] \Users\usuario\Documents\workspaces\myworkspace\qa\Module3\src\com\company\sharedartifact\package\SomeClass.java:[17,85]
cannot find symbol
symbol : class SomeOtherClass
由于公司政策,我无法粘贴整个 -X 日志,但如果某些部分是必要的,我可以更改一些名称。
更新2:
今天我刚刚发现,如果运行
mvn clean install
,它无法编译。但是如果我运行 mvn clean
,那么(在 Eclipse 中)我运行 Maven Update project
,然后 `mvn install,它会编译!
自从我发现这个以来,我已经提到了这个问题并且我相信我的类路径有问题。当我使用 Weblogic Portal 应用程序时,我需要在 Eclipse 上保留一些共享库(项目和运行时都需要的库)。可能某些库被遗忘在我的 pom 上。奇怪的是,编译声称不存在的包确实存在。
我遇到了同样的问题,我使用全新安装构建了项目 并选择:解决工作区工件并成功构建项目。
由于我没有选择,所以我按照@user944849和更新的建议将Maven更新为3.3.9版本,将我的JDK更新为1.8.0_60,但将POM的编译器配置的源和目标保留为指向1.6 .
<plugin>
<artifactId>maven-compiler-plugin</artifactId>
<configuration>
<source>1.6</source>
<target>1.6</target>
</configuration>
</plugin>
之后,模块 3 开始编译,但模块 4 和 5 由于依赖某些 JRockit 库而损坏。为了解决这个问题,我最终更新了已弃用的代码,并且项目最终完全编译了。
所以我相信我使用的 Maven 版本有问题。不知何故,当两个项目依赖于同一个库并且其中一个项目依赖于另一个项目时,它似乎会迷失方向。我没有测试过其他版本,但 3.3.9 对于这些情况工作得很好。