【问题标题】:Eclipse settings affect Maven command-line build?Eclipse 设置会影响 Maven 命令行构建吗?
【发布时间】:2009-10-09 17:21:22
【问题描述】:

我们的大部分项目都是使用 Maven 构建的,其中一些项目使用 com.sun 包中的类。这是一种不好的做法,但我对此无能为力。

有一段时间,这似乎不是一个大问题。然后,在某些时候,我的构建开始失败,出现以下错误:

java.lang.Error: Unresolved compilation problems:
        Access restriction: The type TextSerializer is not accessible due to res
triction on required library C:\Program Files\Java\jre1.5.0_15\lib\rt.jar

这很公平,但我终其一生都想不出如何关闭该检查。从命令行和 Eclipse 中构建都失败了,所以我认为它一定是一些 Maven 设置。

最终我发现问题出在 Eclipse 上。我去了 Preferences > Java > Compiler > Errors/Warnings > Deprecated and restricted API 并将“Forbidden Reference”更改为“Warning”。此后,我的构建开始工作。这对我来说完全无法理解,因为我在从命令行构建时遇到了错误。

有人可以向我解释一下 Eclipse 设置如何以某种方式影响命令行构建的行为吗?!

【问题讨论】:

  • Eclipse 是否设置为使用与 Maven 相同的 JRE?
  • 是的,Eclipse 设置为使用相同的 JRE。
  • 如果您恢复 Eclipse 首选项,您的构建又开始失败了?

标签: eclipse maven-2


【解决方案1】:

您遇到了 m2eclipse 常见问题解答中提到的Compilation errors on restricted classes 问题,并应用了常见问题解答中建议的相同解决方案:

使用来自rt.jar 的类的项目, 例如com.sun.*(和其他一些) 可能会出现编译错误,例如: “访问限制:类型 RE 是 由于限制无法访问 所需库 /lib/rt.jar”。这样的错误 指示使用非 API 类和 这些访问规则由 Eclipse JDT。

您可以将编译器设置更改为 在这些限制上不会失败 Window / 中的工作区设置 首选项 / Java / 编译器 / 错误/警告/已弃用和 受限 API / 禁止引用 (访问规则)/警告;或者 来自项目/属性的每个项目 / Java 编译器 / 错误/警告 / 已弃用和受限的 API / 禁止引用(访问规则)/ 警告

这当然不会影响 Eclipse 之外的 JDK。话虽如此,您在评论中写道,Eclipse 设置为使用与 Maven 相同的 JRE,但是...... Maven 需要一个 JDK 来编译类(它需要 javac)。所以我的猜测是,您实际上使用的是非 javac 编译器,并且在某处声明了 compilerId。像这样:

<plugin>
  <artifactId>maven-compiler-plugin</artifactId>
  <configuration>
    <compilerId>eclipse</compilerId>
  </configuration>
  <dependencies>
    <dependency>
      <groupId>org.codehaus.plexus</groupId>
      <artifactId>plexus-compiler-eclipse</artifactId>
      <version>xxxx</version>
    </dependency>
  </dependencies>
</plugin>

这告诉编译器插件使用 eclipse 编译器以及它的设置。

编辑:根据评论,上述假设不适用于 OP。

我的下一个建议是尝试重现问题,但在 compile 之前运行 mvn clean 例如:

mvn clean install

据报道,这似乎解决了问题(正如我所料)。我应该马上想到这一点:Eclipse 甚至为有编译错误的类生成 .class 文件。因此,clean 解决了 maven 命令行级别的(不是那么)奇怪的行为。

实际上,我的建议是使用How to configure Maven project to use separate output folders in Eclipse 中提到的设置来避免任何类似的问题。这实际上是 0.9.4 版之前 m2eclipse 的默认设置。此更改的原因在this dev-list thread 中讨论。

【讨论】:

  • 感谢您的帮助,但我为“compilerId”抓取了整个项目,但它什么也没显示,所以不是这样。
  • maven 真的使用与 Eclipse 相同的 JRE 吗? JAVA_HOME 的值是多少?
  • JAVA_HOME=C:\Program Files\Java\jdk1.5.0_15 PATH includes %JAVA_HOME%\bin Eclipse 设置为使用相同的版本。 Java 1.5.0_15 的选择是经过深思熟虑的,因为这里有一个“需要”它的项目,但我尝试使用 1.6.0_16 并遇到了同样的问题。
  • 好的,所以maven实际上是在使用JDK......另一个问题:你能重现这个问题吗?如果是的话,如果你在编译之前运行mvn clean会发生什么?
  • 我已经在两台不同的机器上可靠地重现了这个问题——否则我会断定我快疯了。我曾以为我尝试过 mvn clean,但显然没有。我的同事在几分钟内击败了您的建议,并尝试解决了问题并引导我进行解释 - 请参阅上面的答案。感谢您的帮助!
【解决方案2】:

我发现给 Eclipse 构建一个独立于 Maven CLI 构建的目录会很有帮助:

将以下内容插入您的 pom.xml。 “m2e.version”属性的存在将激活以下配置文件,这会改变 Eclipse 构建的位置

<profiles>
  <profile>
    <id>IDE</id>
    <activation>
      <property>
        <name>m2e.version</name>
      </property>
    </activation>
    <build>
      <!-- Put the IDE's build output in a folder other than target, so that IDE builds don't interact with Maven builds -->
      <directory>target-ide</directory>
    </build>
</profile>

【讨论】:

【解决方案3】:

我的同事很有帮助地指出mvn clean install 解决了这个问题。最终我们发现 (M2)Eclipse 在目标目录中留下了一些部分编译的类,当然 vanilla Maven 不知道它应该重新编译这些类。我对此有点恼火。任何人都应该清楚,在目标目录中留下损坏的输出势必会巧妙地污染以后的构建。

【讨论】:

  • 查看我的回答,了解您提到的问题的解决方案。
  • FWIW,你不应该有不同的无头和 IDE 编译器设置。您的问题正好说明了原因。
  • 有问题的设置在原版编译器中甚至不存在。因此,尽管您的建议是合理的,但前提是您了解 Eclipse 编译器中的每个晦涩功能以及如何将其关闭。
【解决方案4】:

是的,“干净”是关键 但是请注意,它不仅有失败的构建——不知何故或其他 m2eclipse 只是留下垃圾,即使它编译正确。

这也可能导致类似的事情

java.lang.Error:未解决的编译问题:

从命令行

【讨论】:

    【解决方案5】:

    我在 Maven 项目中使用 Netbeans (6.9.1) 时看到了类似的问题。 mvn clean 解决了问题。

    【讨论】:

      猜你喜欢
      • 2010-11-02
      • 2015-03-29
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-07-17
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多