首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >java9‘-带有内部包的第8版(例如sun.misc.Unsafe)

java9‘-带有内部包的第8版(例如sun.misc.Unsafe)
EN

Stack Overflow用户
提问于 2018-11-30 15:39:36
回答 1查看 684关注 0票数 4

我正在尝试用Maven (3.8.0)创建一个多释放罐。我们称之为sun.misc.Unsafe,它在java8和java11中编译得很好。但是,使用java11 --release 8进行编译会引发Compilation failure: package sun.misc does not exist

下面是如何重现错误:

一个调用Unsafe的简单类

代码语言:javascript
复制
public class ChangeableObjects {
    sun.misc.Unsafe unsafe;
}

简单的pom:

代码语言:javascript
复制
<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包以使其正常工作?

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 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

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/53560584

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档