Maven编译错误:找不到该包。

9

我正在尝试为一个现有的企业项目添加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上失败,提示包xxx.yyy不存在找不到符号XXXYYY。包xxx.yyy和符号XXXYYY在一个jar文件中,并列在模块2和3的依赖项中。
由于两个模块都依赖相同的jar文件,所以我试图仅将其添加到模块2的依赖项中,并认为由于传递依赖关系,模块3应该能看到它,但它无法看到该包。因此,我尝试在模块2和3的pom文件中都添加依赖项,但问题仍然存在。
我已经检查/尝试过以下内容:
  • 所请求的jar文件列在我的依赖项中。我运行了以下命令,之后可以在依赖列表中看到所需的.jar文件:mvn dependency:copy-dependencies
  • 如上所述,我尝试通过传递依赖关系和在我的pom文件中直接引用它来放入我的类路径,但两种解决方案都没有起作用
  • 我尝试删除整个存储库并重新下载所有内容,但也没有起作用
我的项目的唯一特殊之处在于模块3依赖于模块2,并且依赖于模块2也依赖的一个库。
下面我贴出模块2和3的pom文件。由于公司政策,我更改了一些名称。
<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>

    ...

模块三

<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中删除依赖项时,它不会出现“包不存在”的错误,但随后会从Module2 jar出现“包不存在”的错误。

看起来有些依赖关系丢失了,因为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`,它就会编译!

自从我发现这个问题以来,我已经参考了这个问题,并且我相信我的类路径出了问题。因为我正在使用Weblogic Portal应用程序,所以我需要在Eclipse上保留一些共享库(那些项目和运行时都需要的库)。可能我的pom文件中忘记了某个库。奇怪的是,编译声称不存在的包实际上确实存在。


你能用 X 开关打印调试输出(包含错误信息)吗? - Adonis
我无法粘贴整个输出,因为公司不允许我公开一些名称。我正在使用错误进行编辑。当我使用-X运行时,我可以在类路径中看到所需的jar包,Java和Maven版本也正确,并且编译错误如预期般发生。 - cristianorbs
1
顺便提一下,构建过程中可以升级Java和Maven,并使用旧版Java进行运行。您只需要确保在POM文件中将Java源和目标配置为1.6即可。您可以通过配置单个插件(编译器、Surefire等)或使用Toolchains手动执行此操作。如果您担心新的Java内容会悄悄地出现,请使用animal-sniffer插件和/或maven-enforcer,在使用较新类时中断构建。 - user944849
@bitsmcgee77 我还没想出来。所以我正在使用我在更新2中提到的(非常糟糕的)方法。它可以编译和打包,但是我有一个依赖于Eclipse的问题。 - cristianorbs
@cristianorbs 我解决了我的问题,也许可以帮到你:https://dev59.com/FaDia4cB1Zd3GeqPJ9Rv - bitsmcgee77
显示剩余2条评论
2个回答

0

我曾经遇到过同样的问题,我使用了clean install命令重新构建了项目,并勾选了“解决工作区组件”,项目最终成功构建。


-2

由于我已经没有其他选择,我按照@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开始编译,但由于依赖于一些JRockit库,模块4和5崩溃了。为了解决这个问题,我最终更新了过时的代码,项目最终完全编译。

因此,我认为我使用的Maven版本存在问题。不知何故,当2个项目依赖于相同的库并且其中一个依赖于另一个时,它似乎会迷失。我没有测试其他版本,但对于这些情况,3.3.9版本运行良好。


在artifactId标签之前,难道不应该有“<groupId>org.apache.maven.plugins</groupId>”吗? - MasterJoe
通常是的,但 org.apache.maven.plugins 是默认值,因此不必提供。 - Itchy

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接