我正在尝试用Maven (3.8.0)创建一个多释放罐。我们称之为sun.misc.Unsafe,它在java8和java11中编译得很好。但是,使用java11 --release 8进行编译会引发Compilation failure: package sun.misc does not exist。
下面是如何重现错误:
一个调用Unsafe的简单类
public class ChangeableObjects {
sun.misc.Unsafe unsafe;
}简单的pom:
<build>
<plugins>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-compiler-plugin</artifactId>
<version>3.8.0</version>
<configuration>
<release>8</release>
</configuration>
</plugin>
</plugins>
</build>如果我们对<release>8</release>行进行注释,它在java8和java11上可以正常工作。
如果按原样编译代码,那么它将在java8中失败;这是正常的,因为它是java9特性。问题是它在java11中也失败了。
我想问题是sun.misc包已经在java8和java9之间移动了。但是,release标志的用途仍然是,使用java8编译良好的代码也应该使用java11进行良好编译。
我是否误解了如何使用release标志?是否需要手动链接sun.misc包以使其正常工作?
发布于 2018-12-04 22:30:54
首先,正如评论中所述,不推荐我构建多版本jar的方式(按照我提供的链接)。使用null指针给出的示例,
我更喜欢用像https://github.com/meterware/multirelease-parent/blob/master/pom.xml这样的东西
我使用了Maven工具链,它允许使用不同的JDK进行编译。这样,我的问题就消失了。
其次,在用jdk11进行--release 8编译时,我得到编译错误的原因实际上是由khmarbaise给出的,他指出了https://stackoverflow.com/a/43103038/296328。
javac提供了两个命令行选项,-source和-target,它们可以分别用于选择编译器接受的Java语言版本和它生成的类文件的版本。但是,默认情况下,javac是根据平台API的最新版本进行编译的。因此,编译后的程序可能会意外地使用仅在当前版本的平台中可用的API。这些程序不能在平台的旧版本上运行,不管传递给-source和`-target的值如何。选项。这是一个长期的可用性痛点,因为用户期望通过使用这些选项,他们将获得可以在指定平台版本上运行的类文件。
然而,似乎有一些解决办法:例如,请参见Maven: javac:源代码版本1.6需要目标版本1.6。
https://stackoverflow.com/questions/53560584
复制相似问题