限制由javapackager添加的模块

我试图通过限制它包含的模块来减小我的应用程序的大小。 我已经使用jlink为我的运行时做了这个。 但是,当我使用--add-modules--limit-modules选项运行javapackager使用逗号分隔的列表来显示我用于运行时的相同的一javapackager --add-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 

事实certificate,它之所以没有尊重我的选择,是因为我的app jar不是Java 9模块。 这是一个普通的旧jar子。 在Java 9中, javapackager使用javapackager生成运行时,并且不会尝试限制模块的数量,因为它无法确定模块的依赖性。 -Bruntime选项仅适用于Java Web Start应用程序。 如果你想让javapackager不使用javapackager ,你必须使用JDK 8中的那个。

由于所有第三方依赖关系的复杂性,我无法将我的app jar变成一个模块(你可以在这个问题中看到详细信息)。 我不能使用JDK 8,因为我需要在Java 9中将一些API添加到Desktop模块中。因此,我找到了一种解决方法,可以使用Java 9 javapackager在应用程序中获得更轻薄的运行时:

  1. 通过使用--add-modules选项仅指定所需的模块,使用jlink生成更轻薄的运行时。 您可以使用jdeps命令确定应用程序中所有jar所需的模块。
  2. 像往常一样使用javapackger生成带有完整运行时的.app。
  3. 打开生成的.app文件(macOS)或Windows,使用可以编辑.exe或.msi安装程序的东西(不知道如何自己编写)。
  4. 在macOS上,将.app/Contents/PlugIns/Java.runtime/Contents/Home替换为更瘦的运行时的内容。 为Windows安装程序执行类似操作。

使用命令行javapackager ,您可以使用部署选项 --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任务包括: –