我们的大多数项目都是使用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 设置如何以某种方式影响命令行的构建行为?!
答案 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
解决了这个问题。