【问题标题】:Maven compilation error: package does not existMaven编译错误:包不存在
【发布时间】:2017-08-30 02:17:34
【问题描述】:

我正在尝试向现有企业项目添加 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 existCannot find symbol XXXYYY。包 xxx.yyy 和符号 XXXYYY 位于一个 jar 中,该 jar 列在模块 2 和 3 的依赖项上。

由于两个模块都依赖于同一个 jar,因此我尝试仅添加对模块 2 的依赖项,并且我相信模块 3 由于传递性依赖关系而应该看到它,但它看不到包。所以我尝试将依赖项添加到模块 2 和 3 的 pom 中,但问题仍然存在。

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

  • 请求的 jar 列在我的依赖项中。我运行了以下命令,之后我可以在依赖项列表中看到所需的 .jar 文件:mvn dependency:copy-dependencies
  • 如上所述,我尝试通过传递依赖项放入我的类路径并直接在我的 pom 上引用它,但两种解决方案均无效
  • 我试图删除我的整个存储库并重新下载所有内容,但也没有成功

我项目的唯一特殊性是模块 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_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 上保留一些共享库(项目和运行时都需要的那些)。可能在我的 pom 上忘记了一些图书馆。奇怪的是,编译声称不存在的包确实存在。

【问题讨论】:

  • 您能否使用X 开关打印调试输出(包含错误)
  • 我无法粘贴整个输出,因为公司不允许我公开某些名称。我正在用给出的错误编辑问题。当我使用 -X 运行时,我在类路径中看到了我需要的 jar,Java 和 Maven 版本都很好,并且由于编译错误而运行正常
  • FWIW,应该可以升级 Java 和 Maven 进行构建,并使用旧 Java 进行运行时。您只需要确保在您的 POM 中将 Java 源和目标配置为 1.6,您可以通过配置单个插件(编译器、Surefire 等)或使用工具链手动执行此操作。如果您担心新的 Java 内容会潜入,请使用 animal-sniffer 插件和/或 maven-enforcer 来中断构建(如果使用了较新的类)。
  • 你有没有想过这个问题?我有一个类似的项目,父项目有两个孩子,孩子 A 依赖孩子 B,孩子 A 看不到孩子 B 的类/包。
  • @bitsmcgee77 我还想不通。所以我使用的是我在更新 2 中提到的(非常糟糕的)方法。它编译和打包,但我依赖于 Eclipse。

标签: java maven module compilation dependencies


【解决方案1】:

由于我用完了选项,我按照@user944849 的建议和更新 Maven 到版本 3.3.9 和我的 JDK 到 1.8.0_60,但在编译器上保留源和目标指向 1.6 的 POM 的配置。

<plugin>
  <artifactId>maven-compiler-plugin</artifactId>        
  <configuration>
     <source>1.6</source>
     <target>1.6</target>
  </configuration>
</plugin>

之后,模块 3 开始编译,但模块 4 和 5 由于依赖于一些 JRockit 库而中断。为了解决这个问题,我最终更新了已弃用的代码,项目最终完全编译。

所以我认为我使用的 Maven 版本存在问题。不知何故,当 2 个项目依赖于同一个库而其中一个项目依赖于另一个时,它似乎迷路了。我没有测试过其他版本,但是 3.3.9 可以很好地处理这些情况。

【讨论】:

  • artifactId标签前不应该有“org.apache.maven.plugins”吗?
猜你喜欢
  • 2019-01-21
  • 2013-12-19
  • 2013-05-31
  • 1970-01-01
  • 2019-08-09
  • 2014-01-29
  • 2023-04-11
  • 2018-12-14
  • 2013-10-30
相关资源
最近更新 更多