Eclipse设置会影响Maven命令行构建吗?

时间:2009-10-09 17:21:23

标签: eclipse maven-2

我们的大多数项目都是使用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 。我去了偏好> Java>编译器>错误/警告>弃用和受限制的API并将“禁止参考”更改为“警告”。此后,我的构建开始工作。这对我来说完全不可理解,因为我在从命令行构建时遇到了错误。

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

5 个答案:

答案 0 :(得分:4)

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

  

使用rt.jar中的类的项目,   例如com.sun.*(以及其他一些)   可以有编译错误,如:   “访问限制:类型RE是   由于限制而无法访问   所需的图书馆   /lib/rt.jar“。这样的错误   表示使用非API类和   这些访问规则由。定义   Eclipse JDT。

     

您可以将编译器设置更改为   在这些限制中没有失败   窗口中的工作区设置/   首选项/ 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。

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

mvn clean install

据报道,这似乎解决了这个问题(正如我所料)。我应该立即想到这一点:即使对于编译错误的类,Eclipse也会生成.class文件。因此,maven命令行级别的(不是那样)奇怪的行为由clean解决。

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

答案 1 :(得分:1)

我发现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>

答案 2 :(得分:0)

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

答案 3 :(得分:0)

是的,“干净”是关键 但请注意,它不仅仅是因为它存在故障 - 不知何故或其他m2eclipse只会留下垃圾,即使它编译正确。

这也会导致像

这样的事情

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

从命令行

答案 4 :(得分:0)

我看到使用Netbeans(6.9.1)和Maven项目的类似问题。 mvn clean解决了这个问题。