在我的应用程序安装的某些计算机(但不是全部)中,在看起来成功安装之后,当您尝试运行它时,它会显示以下错误:
该文件存在于该目录中,因此,我不确定为什么它说找不到该库.
之后出现了这个错误
最后:
然后没有任何反应.该应用程序无法启动.有什么想法发生了什么?
有人指出,这似乎是在谈论这个问题,这个bug报告:https://bugs.openjdk.java.net/browse/JDK-8191176但我已经建立了我的8u162以及8u172(早期访问应用程序,特别是,jdk-8u172-ea-bin-b03-windows-x64-18_jan_2018),结果是一样的.它发生在Windows 10 Pro 1703以及1709上.
我不确定还有什么可能相关.
我试图通过限制它包含的模块来减少我的应用程序的大小.我已经为我的运行时使用了这个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, …
Run Code Online (Sandbox Code Playgroud) javapackager
Java SE部署指南/ 自包含应用程序打包中的示例2-1的上述说明指出-deploy命令中需要jar文件.
如果我使用模块化jar,我收到此错误消息:
异常:java.lang.Exception:错误:srcfiles中不允许使用模块:[dist\tcdmod.jar].
如果我使用等效的非模块化jar,则生成的包包含完整的运行时.但我想使用我在/ dist文件夹中使用jlink创建的减少的运行时间.
javapackager命令可以使用jlink生成的运行时进行部署吗?怎么样?
标题为"JRE的自定义"的部分未提及该javapackager
命令.
以下"模块化应用程序的打包"部分包含以下行:
使用Java Packager工具打包模块化应用程序以及非模块化应用程序.
Java Packager工具与众不同javapackager
吗?javapackager
本节中没有使用示例.
这是我使用的javapacker命令:
javapackager -deploy -native -outdir packages -outfile ToneCircleDrone -srcdir dist -srcfiles tcdplain.jar -appclass com.adonax.tanpura.TCDLaunch -name "ToneCircleDrone" -title "ToneCircleDrone test"
Run Code Online (Sandbox Code Playgroud)
javapackager文档中的说明没有提到使用jlink运行时的场景.有一个Bundler参数-Bruntime,但它仅用于指向除系统默认值AFAIK之外的已安装运行时.
我刚刚安装了macOS High Sierra(10.13)并且我正在尝试更新我编写的教程,该教程展示了如何将Java Swing应用程序(可执行JAR)打包到macOS安装程序中.
该教程的步骤在macOS Serra(10.12)上运行良好.
现在javapackager
命令崩溃了:
错误:找不到文件.(-43)存档:/var/folders/c1/hkb.../images/ShowTime/.VolumeIcon.icns
系统信息:
Darwin Comet.local 17.0.0 Darwin Kernel Version 17.0.0: Thu Aug 24 21:48:19 PDT 2017; root:xnu-4570.1.46~2/RELEASE_X86_64 x86_64
java version "9"
Java(TM) SE Runtime Environment (build 9+181)
Java HotSpot(TM) 64-Bit Server VM (build 9+181, mixed mode)
Run Code Online (Sandbox Code Playgroud)
重现的简化步骤:
curl --remote-name https://centerkey.com/mac/java/ShowTime.java
javac ShowTime.java
echo "Main-Class: ShowTime" > MainClass.txt
jar cmf MainClass.txt ShowTime.jar *.class
jdk=$(/usr/libexec/java_home)
$jdk/bin/javapackager -deploy -native dmg -name ShowTime \
-srcdir . -srcfiles ShowTime.jar -appclass ShowTime \
-outdir …
Run Code Online (Sandbox Code Playgroud) 我开发并分发了使用Apache Batik和JavaCV的Java Swing应用程序。我已经通过Java 1.6、7和8更新了它。macOS,Windows和Linux的安装程序是使用Javapackager构建的。Java 8的支持在19年1月终止,我找不到在新的LTS版本Java 11上打包和分发的解决方案。
JavaCV或Batik都不生产模块化jar,但是我设法将它们重新打包到可以在Java 11上编译并生成可运行jar的程度,app可以正常工作,但我不能打包以进行分发。我打算降级到Java 10以使用javapackager并从那里捆绑11个运行时,但是它使用jlink生成自定义运行时,因为JavaCV和Batik不是模块化的,所以jlink失败了。由于Batik和JavaCV中的引用不令人满意,即使我的应用程序在没有它们的情况下也能正常工作,但jdeps不会生成用于修补的module-info.class并使它们模块化。
结果,我将不得不离开Java 8的代码库,即使不再支持它,也要交付它。
我知道有一个调用来创建javapackager的替代品,但是直到Java 8被弃用之后才会出现。而且我仍然需要Batik和JavaCV项目来重构和构建模块化jar,以生成自定义运行时。
任何人都可以提供其他解决方案吗?我错过了什么吗?谢谢。
环境: Win10、Oracle JDK 9、Eclipse、jlink、javapackager
上下文:我正在尝试生成一个可执行文件,其中包含javapackager
使用 制作的 java 自定义运行时映像jlink
,并阅读javapackager 文档。不可安装。
Jlink 创建了一个 zip 文件,其中包含我所有的 java 类文件和封装的资源(这意味着我无法从系统资源管理器访问它们)+ 自定义 jre。它带有一个 .bat 启动器来运行该应用程序。一切正常。
Walkthrow:第一,我发现OpenJDK14 中jpackage
有一个OpenJDK 实用程序可以使 java 模块化应用程序可执行,该实用程序仍在开发中。我没有找到任何方法来处理它。后来我研究了 Inno Setup,但它不能满足我的需求(因为我不需要安装程序)后来我发现从 Oracle JDK 8 开始,就有了为每个平台(max、linux、windows..)生成可运行文件的工具。javapackager
我无法使 javapackager 工作。这是我在 Windows cmd 上执行的命令的各种尝试之一。
javapackager
-deploy
-native exe
--add-modules myModule,javafx.graphics,javafx.controls
--module-path "C:\path\to\javafx-jmods;C:\path\to\target\classes;C:\path\to\more\jmods"
-outdir "C:\myApp"
-outfile MyApp
-appclass myPackage.MyApp
-name "MyApp"
Run Code Online (Sandbox Code Playgroud)
使用前面的命令我收到错误:
Error: No application jars foun
Run Code Online (Sandbox Code Playgroud)
因此,我意识到我将 -deploy 命令及其选项与 -createjar 命令及其选项混合在一起。
有人可以解释如何使用 javapackager 生成 .exe 吗? …
我正在使用javapackager创建一个使用命令行捆绑jre的exe安装程序.
有没有人知道如何使用命令行添加图标和自定义安装程序.
这些是我使用的命令:
javapackager -deploy -native -outdir packages -outfile myFile
-srcdir documents -srcfiles Application.jar -appclass application.Main
-name "Application" -title "Application Title"
Run Code Online (Sandbox Code Playgroud)
我试图添加license ="info"和其他一些命令
我正在捆绑一个app,javapackager
其中主jar是一个带有module-info.class的模块,但它依赖于许多其他普通旧jar的jar,所以我把它们称为module-info.java中的自动模块.然而,javapackager
抱怨无法找到它们.如何让它找到自动模块的jar文件?
Exception: jdk.tools.jlink.plugin.PluginException: java.lang.module.FindException: Module rcf not found, required by com.username.commander.ui
Exception in thread "main" com.sun.javafx.tools.packager.PackagerException: Error: Bundler "Mac Application Image" (mac.app) failed to produce a bundle.
at jdk.packager/com.sun.javafx.tools.packager.PackagerLib.generateNativeBundles(PackagerLib.java:374)
at jdk.packager/com.sun.javafx.tools.packager.PackagerLib.generateDeploymentPackages(PackagerLib.java:348)
at jdk.packager/com.sun.javafx.tools.packager.Main.main(Main.java:496)
Run Code Online (Sandbox Code Playgroud)
我已经尝试指定模块路径(第一个dir只有主模块jar,第二个dir有所有非模块jar):
/Library/Java/JavaVirtualMachines/jdk-9.0.1.jdk/Contents/Home/bin/javapackager -deploy -native image \
-name Commander -title Commander -vendor "username" \
--module-path /Users/username/Dropbox/coding/commander/Commander-java/moduleJars:/Users/username/Dropbox/coding/commander/Commander-java/packageJars \
--module com.username.commander.ui/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 \
--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
Run Code Online (Sandbox Code Playgroud) 当我们创建jlink运行时映像时,我们可以使用'--strip-debug',' - compress','2',' - no-header-files',' - no-man-pages'等标签,创建一个45mb左右的分发文件夹.
如果我们想使用javapackager,例如创建.DMG文件,我们如何进行类似的压缩?因为这些标签不适用于javapackager.没有它们,最终的捆绑包大约100mb,失去了很多java9模块化的优点,所以我的问题是,是否可以使用javapackager和jlink创建的JRE运行时映像.
谢谢
我运行以下命令为 .jar 文件创建本机包:
javapackager.exe -deploy -native image -srcfiles <files> -appclass <class> -outdir out -outfile test
使用 Java 8u171/172bundles/AppName/
文件夹(包含用于启动 Java 应用程序的 .exe 和一些其他内容)包含以下 DLL 文件:
api-ms-win-core-console-l1-1-0.dll
api-ms-win-core-datetime-l1-1-0.dll
api-ms-win-core-debug-l1-1-0.dll
api-ms-win-core-errorhandling-l1-1-0.dll
api-ms-win-core-file-l1-1-0.dll
api-ms-win-core-file-l1-2-0.dll
api-ms-win-core-file-l2-1-0.dll
api-ms-win-core-handle-l1-1-0.dll
api-ms-win-core-heap-l1-1-0.dll
api-ms-win-core-interlocked-l1-1-0.dll
api-ms-win-core-libraryloader-l1-1-0.dll
api-ms-win-core-localization-l1-2-0.dll
api-ms-win-core-memory-l1-1-0.dll
api-ms-win-core-namedpipe-l1-1-0.dll
api-ms-win-core-processenvironment-l1-1-0.dll
api-ms-win-core-processthreads-l1-1-0.dll
api-ms-win-core-processthreads-l1-1-1.dll
api-ms-win-core-profile-l1-1-0.dll
api-ms-win-core-rtlsupport-l1-1-0.dll
api-ms-win-core-string-l1-1-0.dll
api-ms-win-core-synch-l1-1-0.dll
api-ms-win-core-synch-l1-2-0.dll
api-ms-win-core-sysinfo-l1-1-0.dll
api-ms-win-core-timezone-l1-1-0.dll
api-ms-win-core-util-l1-1-0.dll
api-ms-win-crt-conio-l1-1-0.dll
api-ms-win-crt-convert-l1-1-0.dll
api-ms-win-crt-environment-l1-1-0.dll
api-ms-win-crt-filesystem-l1-1-0.dll
api-ms-win-crt-heap-l1-1-0.dll
api-ms-win-crt-locale-l1-1-0.dll
api-ms-win-crt-math-l1-1-0.dll
api-ms-win-crt-multibyte-l1-1-0.dll
api-ms-win-crt-private-l1-1-0.dll
api-ms-win-crt-process-l1-1-0.dll
api-ms-win-crt-runtime-l1-1-0.dll
api-ms-win-crt-stdio-l1-1-0.dll
api-ms-win-crt-string-l1-1-0.dll
api-ms-win-crt-time-l1-1-0.dll
api-ms-win-crt-utility-l1-1-0.dll
msvcp140.dll
msvcr100.dll
packager.dll
ucrtbase.dll
vcruntime140.dll
Run Code Online (Sandbox Code Playgroud)
其中大部分似乎也存在于runtime/bin/
子文件夹中。
与此相反,使用 Java 8u161 运行相同的 javapackager 命令只会导致包含以下 …
我正在尝试使用javapackager从罐子中生成dmg。
这是我在终端中输入的内容:
cd "/Users/name/Documents/JarToApplication"
jdk=$(/usr/libexec/java_home -v 1.8)
$jdk/bin/javapackager -deploy -native dmg -BappVersion=8 -name DMSLauncher -srcdir . -srcfiles DMSLauncher.jar -appclass com.blockhead7360.dms.launcher.DMSLauncher -Bicon=package/macosx/DMSLauncher.icns -outdir deploy -outfile DMSLauncher -v
Run Code Online (Sandbox Code Playgroud)
它一直运行到这里:
Running [osascript, /var/folders/z5/n802xjnx49l4535kq63992280000gn/T/fxbundler8419176091447096668/macosx/DMSLauncher-dmg-setup.scpt]
/var/folders/z5/n802xjnx49l4535kq63992280000gn/T/fxbundler8419176091447096668/macosx/DMSLauncher-dmg-setup.scpt:635:742: execution error: Finder got an error: The operation can’t be completed because there is already an item with that name. (-48)
java.io.IOException: Exec failed with code 1 command [[osascript, /var/folders/z5/n802xjnx49l4535kq63992280000gn/T/fxbundler8419176091447096668/macosx/DMSLauncher-dmg-setup.scpt] in unspecified directory
at com.oracle.tools.packager.IOUtils.exec(IOUtils.java:165)
at com.oracle.tools.packager.IOUtils.exec(IOUtils.java:138)
at com.oracle.tools.packager.IOUtils.exec(IOUtils.java:132)
at com.oracle.tools.packager.mac.MacDmgBundler.buildDMG(MacDmgBundler.java:376)
at com.oracle.tools.packager.mac.MacDmgBundler.bundle(MacDmgBundler.java:92)
at com.oracle.tools.packager.mac.MacDmgBundler.execute(MacDmgBundler.java:556)
at com.sun.javafx.tools.packager.PackagerLib.generateNativeBundles(PackagerLib.java:352)
at com.sun.javafx.tools.packager.PackagerLib.generateDeploymentPackages(PackagerLib.java:319) …
Run Code Online (Sandbox Code Playgroud) 我想从同一源代码树和同一台机器上构建 .msi、.deb 和 .pkg。
Java9+ 的可分发运行时不再可下载,因此像 launch4j+nsis 这样的完美解决方案不再有效。
javapackager 已经被 Oracle 抛弃了。
OpenJDK 的 jpackager 不能(也永远不会)为不同的构建项目交叉编译,它甚至还不是一个真正的产品。
有没有办法在同一台机器上为 win/linux/macos 构建安装程序?
“一次编译,到处运行”的承诺真的是死而复生了吗?
我有一个遗留的 java 应用程序,现在处于不确定状态,因为 MacOS java8 不支持 java.awt.desktop,它需要 java9+
我正在尝试 java 9-ea (jdk-9+180) 和新的 javapackager 从简单模块创建本机映像,但出现空指针异常。有人知道我是否太早了或者我是否没有使用正确的命令开关来使其工作?jlink 命令工作正常,但 javapackager 却不行。在撰写本文时,我正在使用最新的 jdk-9+180。我已尝试使用-native exe
和-native image
开关,但出现了相同类型的错误。我也在我的 Mac 上尝试过使用交换机创建本机 dmg -native dmg
,但在该平台上出现了相同的错误。我真的很想在这里使用 javapackager 来将构建捆绑到exe/dmg
.
编辑 1: 我已经提交了有关此问题的错误报告,现在可以在以下网址中看到该报告:http://bugs.java.com/bugdatabase/view_bug.do ?bug_id=JDK-8186661
我的模块信息.java:
module my.module {
requires javafx.graphics;
requires javafx.fxml;
exports sample;
}
Run Code Online (Sandbox Code Playgroud)
首先,我使用 javapackager 创建一个运行良好的 jar:
C:\Java9Test\target>javapackager -createjar -appclass sample.Main -srcdir classes -outdir . -outfile myjar -v
我已经验证了生成的 jar 结构看起来与正确编译的module-info.class
以及其中的其他两个类没有问题。
以下 jlink 命令可以工作并生成可运行的简化运行时映像:
C:\Java9Test\target>jlink --output release\MyTestApp --compress=2 --module-path "myjar.jar;C:\Program Files\Java\jdk-9\jmods" --add-modules my.module
但是,当尝试以下命令以使用 javapackager 创建本机映像时失败:
C:\Java9Test\target>javapackager -deploy …
javapackager ×13
java ×10
java-9 ×5
java-module ×2
jlink ×2
macos ×2
windows ×2
dmg ×1
exe ×1
icns ×1
installation ×1
java-11 ×1
java-platform-module-system ×1
javafx ×1
jdeps ×1
terminal ×1