AdoptOpenJDK的JRE 11+是否与在JDK上使用jlink相同,是否添加了所有依赖项 - java

AdoptOpenJDK的JRE 11+是否与仅使用 jlink 并添加所有依赖项相同?

Oracle Java 11及更高版本不只包含JRE JDK,因为您可以使用,jlink 构建仅包含所需系统模块的JRE,这就是我在Windows和Linux上所做的。

但是,对于如何在某些平台(Docker和MacOS)上结合Jlinked JRE而言,这对我来说并不那么明显,而且由于AdoptOpenJDK不仅为JDK提供了二进制文件,还为JRE提供了二进制文件,所以我想我可以将JRE用于这些平台。 但是,如果将JDK链接到JDK并包含所有系统模块依赖项,JRE是否包含所有内容?

参考方案

如果您下载Adopt的JRE并运行java --list-modules,则会得到以下内容(为了更好的可读性,我删除了该版本):

java.base
java.compiler
java.datatransfer
java.desktop
java.instrument
java.logging
java.management
java.management.rmi
java.naming
java.net.http
java.prefs
java.rmi
java.scripting
java.se
java.security.jgss
java.security.sasl
java.smartcardio
java.sql
java.sql.rowset
java.transaction.xa
java.xml
java.xml.crypto
jdk.accessibility
jdk.aot
jdk.charsets
jdk.crypto.cryptoki
jdk.crypto.ec
jdk.dynalink
jdk.httpserver
jdk.internal.ed
jdk.internal.le
jdk.internal.vm.ci
jdk.internal.vm.compiler
jdk.internal.vm.compiler.management
jdk.jdwp.agent
jdk.jfr
jdk.jsobject
jdk.localedata
jdk.management
jdk.management.agent
jdk.management.jfr
jdk.naming.dns
jdk.naming.rmi
jdk.net
jdk.pack
jdk.scripting.nashorn
jdk.scripting.nashorn.shell
jdk.sctp
jdk.security.auth
jdk.security.jgss
jdk.unsupported
jdk.xml.dom
jdk.zipfs

如果下载JDK并使用jlink --add-modules java.se构建映像,则会得到以下信息:

java.base
java.compiler
java.datatransfer
java.desktop
java.instrument
java.logging
java.management
java.management.rmi
java.naming
java.net.http
java.prefs
java.rmi
java.scripting
java.se
java.security.jgss
java.security.sasl
java.sql
java.sql.rowset
java.transaction.xa
java.xml
java.xml.crypto

如您所见,它不包含jdk。*模块,因为严格来讲,运行时不需要这些模块。仍然会注意到他们的缺席,例如如果没有jdk.localedata,则只有英语语言环境(甚至可能只有美国)会起作用。

如果您要求jlink绑定服务,您将获得不同的画面,但与JRE有所不同:

java.base
java.compiler
java.datatransfer
java.desktop
java.instrument
java.logging
java.management
java.management.rmi
java.naming
java.net.http
java.prefs
java.rmi
java.scripting
java.se
java.security.jgss
java.security.sasl
java.smartcardio
java.sql
java.sql.rowset
java.transaction.xa
java.xml
java.xml.crypto
jdk.charsets
jdk.compiler
jdk.crypto.cryptoki
jdk.crypto.ec
jdk.dynalink
jdk.internal.opt
jdk.jartool
jdk.javadoc
jdk.jdeps
jdk.jfr
jdk.jlink
jdk.localedata
jdk.management
jdk.management.jfr
jdk.naming.dns
jdk.naming.rmi
jdk.scripting.nashorn
jdk.security.auth
jdk.security.jgss
jdk.unsupported.desktop
jdk.zipfs

存在,例如jdk.compiler和jdk.javadoc意味着bin目录将包含javacjavadoc工具,可能不是您希望从JRE获得的工具。

这告诉我Adopt的JRE是使用特定模块列表构建的。如果掌握了该模块列表,或者只是使用上面的列表来构建运行时映像,则应该获得与从AdoptOpenJDK下载的JRE完全相同的行为。

请注意以下几点:(a)这只是我的假设,所以不要在上面押注您的项目;(b)您可以将许多标志应用于jlink来修饰生成的图像,例如压缩或剥离调试符号,这将(略微)影响其大小,性能和调试能力。

在Java中,执行“ ++++++++”表达式,编译器未报告任何错误并且可以正确执行? - java

我用eclipse编写了这段代码,用war写过,结果为3d。public static void main(String[] args) { double a = 5d + + + + + +-+3d; System.out.println(a); } 参考方案 您的表情可以改写为(5d) + (+ + + + +-+3d) 其中第一个+是应用于两个操作数的…

Java和C++共享内存 - java

我有一段创建共享内存的C++代码。是否可以编写Java代码来读取C++代码创建的内存,除非使用JNI。顺便说一句,我正在使用Windows操作系统。 参考方案 请参见MappedByteBuffer。这是读写共享内存的标准Java类。我经常使用。是的,您可以使用它与使用共享内存以任何语言编写的任何程序进行通信,并且这都是非常标准的Java,没有JNI。

Java值加变量++ - java

考虑以下代码int val1 = 3; val1++; int val2 = val1++; System.out.println(val1); System.out.println(val2); Val1值= 5;Val2值= 4;为什么Val1的值是“ 5”?据我了解,应该为4,因为:在第1行,它的赋值为3,在第2行,通过val1 ++加上1,结果val…

我可以使用JNI在Java代码中引用C++对象吗? - java

我在任何地方都没有看到(或者也许我很简单,没有看到它),但是有没有办法使用JNI返回c / c ++对象并在Java中使用该对象?例如(非常简单):class simpleClass{ ... private: int intVar; public: int getIntVar(); void setIntVar(int someNum); ... } 在我…

为什么C++中的void方法可以返回void值,而在其他语言中却不能呢? - java

该程序可以用C ++编译并运行,但不能使用多种不同的语言,例如Java和C#。#include <iostream> using namespace std; void foo2() { cout << "foo 2.\n"; } void foo() { return foo2(); } int main() {…