限制javapackager添加的模块
Limit modules added by javapackager
我试图通过限制应用程序包含的模块来减小应用程序的大小。我已经使用 jlink
在我的 运行 时间里这样做了。但是,当我 运行 javapackager
使用 --add-modules
和 --limit-modules
选项时,我使用 运行 的同一小组模块的逗号分隔列表时间,无论如何它坚持添加所有模块。它似乎不想尊重我给它的选择。我怎样才能获得该工具来限制它添加到我的应用程序包中的模块?
"Adding modules: [java.base, java.desktop, java.naming, java.sql, java.xml, java.logging,
java.management, java.scripting, java.compiler, java.rmi, java.activation, jdk.charsets, jdk.xml.dom,
java.datatransfer, jdk.httpserver, javafx.base, java.security.sasl, jdk.zipfs, jdk.crypto.ec,
jdk.management.agent, java.sql.rowset, javafx.swing, jdk.jsobject, jdk.sctp, java.smartcardio,
jdk.unsupported, jdk.scripting.nashorn, java.security.jgss, javafx.graphics, javafx.fxml, jdk.dynalink,
javafx.media, jdk.accessibility, jdk.security.jgss, javafx.web, java.xml.crypto, jdk.jfr, jdk.packager.services, jdk.net, javafx.controls,
java.prefs, jdk.naming.rmi, jdk.jdwp.agent, java.instrument, jdk.management,
jdk.security.auth, java.management.rmi, jdk.naming.dns, jdk.localedata] to runtime image."
outputDir = ...
modulePath = [/Library/Java/JavaVirtualMachines/jdk-9.0.1.jdk/Contents/Home/jmods]
addModules = [java.base, java.desktop, java.naming, java.sql, java.xml, java.logging, java.management, java.scripting, java.compiler, java.rmi, java.activation, jdk.charsets,
jdk.xml.dom, java.datatransfer, jdk.httpserver, javafx.base, java.security.sasl, jdk.zipfs, jdk.crypto.ec, jdk.management.agent, java.sql.rowset, javafx.swing, jdk.jsobject,
jdk.sctp, java.smartcardio, jdk.unsupported, jdk.scripting.nashorn, java.security.jgss, javafx.graphics, javafx.fxml, jdk.dynalink, javafx.media, jdk.accessibility, jdk.security.jgss, javafx.web, java.xml.crypto, jdk.jfr,
jdk.packager.services, jdk.net, javafx.controls, java.prefs, jdk.naming.rmi, jdk.jdwp.agent, java.instrument, jdk.management, jdk.security.auth, java.management.rmi, jdk.naming.dns, jdk.localedata]
limitModules = [java.base, java.desktop, java.naming, java.sql, java.xml, java.logging, java.management, java.scripting, java.compiler, java.rmi, java.activation]
这是我 运行 的命令,替换了用户名等内容:
/Library/Java/JavaVirtualMachines/jdk-9.0.1.jdk/Contents/Home/bin/javapackager -deploy -native image \
-name Commander -title Commander -vendor "username" \
-appclass com.username.commander.ui.AppWindow \
-srcdir /Users/username/Dropbox/coding/commander/Commander-java/packageJars \
-outdir /Users/username/Dropbox/coding/commander/Commander-java/target \
-outfile Commander \
-Bruntime=target/jre-9.0.1 -Bicon=src/main/resources/icons/commander.icns \
-BappVersion=1.0 \
-Bmac.CFBundleIdentifier=com.username.Commander \
-BmainJar=commander-0.0.1-SNAPSHOT-jar-with-dependencies.jar \
--add-modules java.base,java.desktop,java.naming,java.sql,java.xml,java.logging,java.management,java.scripting,java.compiler,java.rmi,java.activation \
--limit-modules java.base,java.desktop,java.naming,java.sql,java.xml,java.logging,java.management,java.scripting,java.compiler,java.rmi,java.activation \
-nosign -v
使用命令行javapackager
,可以利用deploy options--limit-modules
和--add-modules
如:-
javapackager -deploy
--add-modules java.base,java.desktop...
--limit-modules java.base,java.desktop,java.naming...
--module-path your.mods.dir
-native -outdir OUTPUT_DIR -outfile APPLICATION_NAME
-srcdir PACKAGE_SRC_DIR -srcfiles APPLICATION.jar -appclass MAIN_CLASS
-name "YourApplication" -title "SelfContained"
或者通俗地说,部署 ant 任务将包含如下内容:-
<fx:runtime strip-native-commands="false">
<fx:add-modules value="java.base"/>
<fx:add-modules value="java.desktop,java.naming..."/>
<fx:limit-modules value="java.base"/>
<fx:limit-modules value="java.desktop,java.naming..."/>
<fx:module-path value="${java.home}/../images/jmods"/>
<fx:module-path value="${build.dir/modules"/>
</fx:runtime>
事实证明,它不遵守我的选择的原因是因为我的应用程序 jar 不是 Java 9 模块。这是一个普通的旧罐子。在Java 9 中,javapackager
使用jlink
生成运行时,不会尝试限制模块数量,因为它无法确定模块依赖关系。 -Bruntime
选项仅适用于 Java Web Start 应用程序。如果你想让 javapackager
不使用 jlink
,你必须使用 JDK 8.
中的那个
由于涉及所有第 3 方依赖项的复杂性,我无法将我的应用程序 jar 转换为模块(您可以查看详细信息 in this question)。而且我不能使用 JDK 8,因为我需要将一些 API 添加到 Java 9 中的桌面模块。因此,我找到了一种解决方法,可以使用 Java 9 javapackager
:
- 通过使用
--add-modules
选项仅指定您需要的模块,使用 jlink
生成更精简的运行时。您可以使用 jdeps
命令来确定应用程序中所有 jar 需要哪些模块。
- 像往常一样使用
javapackger
生成具有完整运行时的 .app。
- 打开您生成的 .app 文件 (macOS) 或 Windows,使用可以让您编辑 .exe 或 .msi 安装程序的东西(我自己不知道该怎么做)。
- 在 macOS 上,将
<myApp>.app/Contents/PlugIns/Java.runtime/Contents/Home
的内容替换为您的 slimmer 运行时的内容。为 Windows 安装程序做类似的事情。
我试图通过限制应用程序包含的模块来减小应用程序的大小。我已经使用 jlink
在我的 运行 时间里这样做了。但是,当我 运行 javapackager
使用 --add-modules
和 --limit-modules
选项时,我使用 运行 的同一小组模块的逗号分隔列表时间,无论如何它坚持添加所有模块。它似乎不想尊重我给它的选择。我怎样才能获得该工具来限制它添加到我的应用程序包中的模块?
"Adding modules: [java.base, java.desktop, java.naming, java.sql, java.xml, java.logging,
java.management, java.scripting, java.compiler, java.rmi, java.activation, jdk.charsets, jdk.xml.dom,
java.datatransfer, jdk.httpserver, javafx.base, java.security.sasl, jdk.zipfs, jdk.crypto.ec,
jdk.management.agent, java.sql.rowset, javafx.swing, jdk.jsobject, jdk.sctp, java.smartcardio,
jdk.unsupported, jdk.scripting.nashorn, java.security.jgss, javafx.graphics, javafx.fxml, jdk.dynalink,
javafx.media, jdk.accessibility, jdk.security.jgss, javafx.web, java.xml.crypto, jdk.jfr, jdk.packager.services, jdk.net, javafx.controls,
java.prefs, jdk.naming.rmi, jdk.jdwp.agent, java.instrument, jdk.management,
jdk.security.auth, java.management.rmi, jdk.naming.dns, jdk.localedata] to runtime image."
outputDir = ...
modulePath = [/Library/Java/JavaVirtualMachines/jdk-9.0.1.jdk/Contents/Home/jmods]
addModules = [java.base, java.desktop, java.naming, java.sql, java.xml, java.logging, java.management, java.scripting, java.compiler, java.rmi, java.activation, jdk.charsets,
jdk.xml.dom, java.datatransfer, jdk.httpserver, javafx.base, java.security.sasl, jdk.zipfs, jdk.crypto.ec, jdk.management.agent, java.sql.rowset, javafx.swing, jdk.jsobject,
jdk.sctp, java.smartcardio, jdk.unsupported, jdk.scripting.nashorn, java.security.jgss, javafx.graphics, javafx.fxml, jdk.dynalink, javafx.media, jdk.accessibility, jdk.security.jgss, javafx.web, java.xml.crypto, jdk.jfr,
jdk.packager.services, jdk.net, javafx.controls, java.prefs, jdk.naming.rmi, jdk.jdwp.agent, java.instrument, jdk.management, jdk.security.auth, java.management.rmi, jdk.naming.dns, jdk.localedata]
limitModules = [java.base, java.desktop, java.naming, java.sql, java.xml, java.logging, java.management, java.scripting, java.compiler, java.rmi, java.activation]
这是我 运行 的命令,替换了用户名等内容:
/Library/Java/JavaVirtualMachines/jdk-9.0.1.jdk/Contents/Home/bin/javapackager -deploy -native image \
-name Commander -title Commander -vendor "username" \
-appclass com.username.commander.ui.AppWindow \
-srcdir /Users/username/Dropbox/coding/commander/Commander-java/packageJars \
-outdir /Users/username/Dropbox/coding/commander/Commander-java/target \
-outfile Commander \
-Bruntime=target/jre-9.0.1 -Bicon=src/main/resources/icons/commander.icns \
-BappVersion=1.0 \
-Bmac.CFBundleIdentifier=com.username.Commander \
-BmainJar=commander-0.0.1-SNAPSHOT-jar-with-dependencies.jar \
--add-modules java.base,java.desktop,java.naming,java.sql,java.xml,java.logging,java.management,java.scripting,java.compiler,java.rmi,java.activation \
--limit-modules java.base,java.desktop,java.naming,java.sql,java.xml,java.logging,java.management,java.scripting,java.compiler,java.rmi,java.activation \
-nosign -v
使用命令行javapackager
,可以利用deploy options--limit-modules
和--add-modules
如:-
javapackager -deploy
--add-modules java.base,java.desktop...
--limit-modules java.base,java.desktop,java.naming...
--module-path your.mods.dir
-native -outdir OUTPUT_DIR -outfile APPLICATION_NAME
-srcdir PACKAGE_SRC_DIR -srcfiles APPLICATION.jar -appclass MAIN_CLASS
-name "YourApplication" -title "SelfContained"
或者通俗地说,部署 ant 任务将包含如下内容:-
<fx:runtime strip-native-commands="false">
<fx:add-modules value="java.base"/>
<fx:add-modules value="java.desktop,java.naming..."/>
<fx:limit-modules value="java.base"/>
<fx:limit-modules value="java.desktop,java.naming..."/>
<fx:module-path value="${java.home}/../images/jmods"/>
<fx:module-path value="${build.dir/modules"/>
</fx:runtime>
事实证明,它不遵守我的选择的原因是因为我的应用程序 jar 不是 Java 9 模块。这是一个普通的旧罐子。在Java 9 中,javapackager
使用jlink
生成运行时,不会尝试限制模块数量,因为它无法确定模块依赖关系。 -Bruntime
选项仅适用于 Java Web Start 应用程序。如果你想让 javapackager
不使用 jlink
,你必须使用 JDK 8.
由于涉及所有第 3 方依赖项的复杂性,我无法将我的应用程序 jar 转换为模块(您可以查看详细信息 in this question)。而且我不能使用 JDK 8,因为我需要将一些 API 添加到 Java 9 中的桌面模块。因此,我找到了一种解决方法,可以使用 Java 9 javapackager
:
- 通过使用
--add-modules
选项仅指定您需要的模块,使用jlink
生成更精简的运行时。您可以使用jdeps
命令来确定应用程序中所有 jar 需要哪些模块。 - 像往常一样使用
javapackger
生成具有完整运行时的 .app。 - 打开您生成的 .app 文件 (macOS) 或 Windows,使用可以让您编辑 .exe 或 .msi 安装程序的东西(我自己不知道该怎么做)。
- 在 macOS 上,将
<myApp>.app/Contents/PlugIns/Java.runtime/Contents/Home
的内容替换为您的 slimmer 运行时的内容。为 Windows 安装程序做类似的事情。