2017-04-04 137 views
4

我试图将maven支持添加到现有的企业项目中。这是一个多模块项目,前两个模块编译和打包时没有问题,但是我正面临编译错误,我尝试在多个模块中使用相同的依赖项。 我的结构是:Maven编译错误:程序包不存在

> + 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 existCannot find symbol XXXYYY。包xxx.yyy和符号XXXYYY是在模块2和3的依赖项上列出的jar中。

由于两个模块都依赖于同一个jar,所以我试图只在模块2上添加依赖关系,而我相信模块3应该看到它是因为传递依赖性,但它看不到该包。所以我试图添加依赖到模块2和3 poms,问题依然存在。

我已经检查/尝试了这些:

  • 请求的罐子是我的依赖条件上市。我已经运行了下面的命令,然后我可以在依赖关系列表中看到所需的.jar文件:mvn dependency:copy-dependencies
  • 正如我上面所说的,我尝试通过传递依赖项放入我的类路径并直接引用它POM和两种解决方案没有奏效
  • 我试图删除我的整个仓库,并再次下载的一切,也没有工作

我的项目的唯一特殊性在于,模块3取决于模块2和依赖在模块2也依赖的库上。

下面我粘贴模块2和3中的poms。由于公司政策,我更改了一些名称。

模块-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_29Maven 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,它会编译!

由于我发现这个,我已经提到this question,我相信我的类路径有问题。在我使用Weblogic Portal应用程序时,我需要在Eclipse上保留一些共享库(项目和运行时需要的库)。可能有些图书馆正在被遗忘。奇怪的是,编译声称不存在的软件包存在。

+0

您可以用'X'开关打印调试输出(包含错误) – Adonis

+0

由于某些公司不允许我公开的名称,我无法粘贴整个输出。我正在编辑与给出的错误的问题。当我使用-XI运行时,请在类路径中看到我需要的jar,Java和Maven版本是正常的,并且从编译错误 – cristianorbs

+1

FWIW开始如预期的那样,应该可以升级Java和Maven以供构建和使用旧Java运行时。您只需确保Java源代码和目标在您的POM中配置为1.6,您可以通过配置单个插件(Compiler,Surefire等)或使用工具链手动执行此操作。如果您担心新的Java漏洞,使用动物嗅探器插件和/或maven-enforcer来破坏构建,如果使用更新的类。 – user944849

回答

0

因为我是跑出来的选择,我遵循的是由@ 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在这些情况下工作正常。