5

在一个特定的项目中,我(目前)只允许使用 JRE6 来执行 Java 应用程序。因此,我maven-compiler-plugin为源和目标配置了 1.6。

在我的 Maven 依赖项中,我包含了一个依赖项,它本身以 1.7 为目标,并且还使用了 1.7 功能,例如 try-with-resources——我认为这会在我自己的项目中导致一些编译时错误或警告(我正在使用 Eclipse) . 但事实并非如此,所以我的问题是:在我的情况下是 JRE6 的特定目标 JRE 上运行应用程序(或测试)之前是否可以检测到此类问题?

4

2 回答 2

1

虽然只是部分答案,但我找到了 Mihai 提到的具有不同库签名的问题的解决方案。有一个Animal Sniffer Maven Plugin可以让你指定一个特定的 Java 运行时,它在某个阶段(例如测试)检查它。

但这并不能解决类文件版本问题,因为 Maven 只是吞下(-nowarn)来自 javac 的那些警告,正如对此问题的评论中所解释的那样。

于 2013-01-21T09:30:02.400 回答
0

(我将把它变成一个交互式答案;我还没有答案。)

有点棘手。我知道一个可以梳理依赖版本的 Ning 插件,但我没有看到任何检查类文件版本的选项。我知道如果javac发现链接类的版本太新,它会抱怨- 你能跟踪 Maven 输出并确认 javac 选项吗?

无论如何,即使出现错误,您也不是 100% 安全的。我将不得不发布一个答案,这里的空间不足。这是我遇到的一个轶事。它以 Java 1.4 和 Java 5 为特色,但它有助于阐明为什么您仍然会遇到麻烦。

轶事将支持这样一种观点,即您应该努力使您的库保持与其使用者相同(或更低)的级别,并始终使用正确的 JDK 进行编译

不管怎样,就到这里吧。假设您new java.math.BigInteger(1)为 Java 1.4 编译该行。您使用 Java 5 编译器和 1.4 目标,所以一切听起来都不错。但是 Java 5 核心库包含一个带参数的BigInteger构造int函数,因此您的类将使用对该构造函数的引用来构建。不幸的是,Java 1.4 没有此版本的BigInteger构造函数,如果您稍后在 1.4 JVM 中运行此代码,您将收到运行时错误。使用适当的 Java 1.4 编译器会发生的事情是,编译器会产生一个内部转换 from inttodouble以服务于采用双精度的适当构造函数。

于 2013-01-21T03:24:09.750 回答