当前位置: 首页 > 知识库问答 >
问题:

安装后如何使用jpack添加另一个目录(捆绑包)Java程序

仲孙兴旺
2023-03-14

我正在使用jpackage在Windows上创建本机Java安装程序。我的应用程序还需要一个JDBC库(例如mysql-connector-java-8.0.28.jar)来运行本机应用程序以连接数据库。

我正在使用NetBeans构建应用程序,在构建之后,我看到mysql-connector-java-8.0.28.jar位于dist/libdirectory中。

这意味着,如果我在 dist 目录中运行 java -jar .jar我的程序,应用程序将引用 lib 库中的 mysql-连接器-java-8.0.28.jar

我的项目中的目录是这样的:

dist/
  lib/mysql-connector-java-8.0.28.jar
  myProgram.jar

这是使用jpackage并安装本机应用程序后的结果:

myProgram/
   app/myProgram.jar
   runtime/<the jre directory>
   myProgram.exe

我运行应用程序,我得到的错误是JDBC类找不到:

Exception in thread "main" java.lang.NoClassDefFoundError: javax/naming/NamingException
        at com.mysql.cj.jdbc.NonRegisteringDriver.connect(NonRegisteringDriver.java:186)
        at java.sql/java.sql.DriverManager.getConnection(DriverManager.java:681)

我使用此命令创建安装程序:

 jpackage \
--type exe \
--runtime-image minimal-jre \
--main-jar myProgram.jar \
--input target \ 
--win-console

那么,我的问题是,如何捆绑lib文件夹,让. exe程序可以连接JDBC类?

文档:https://docs.oracle.com/en/java/javase/14/docs/specs/man/jpackage.html

共有1个答案

颛孙智勇
2023-03-14

我向Maven或Gradle声明了所有依赖项(包括JDBC驱动程序),该工具自己将构建应用程序jar,并将其与所有依赖项一起放到lib文件夹中。JPackage将使用该lib文件夹创建一个包,在运行时将所有这些文件都放在类路径上。

因此,如果mysql.jar最终没有出现在该目录中,也许您想运行jpackage两次:

  • 运行 jpackage 以创建应用映像。这是实际打包发生之前的目录结构。
  • 将文件添加到应用映像结构中,以放置所需的位置
  • 运行 jpackage 以完成包的构建

有了这个,您可以自定义jpackage无法开箱即用的很多东西。

 类似资料:
  • 我有两个捆绑说A和B。A 依赖于 B(在 A 的 MANIFEST 中指定为 Required-Bundle:B)。 现在我安装两个A, B包一个接一个(c 我从异常中了解到捆绑包B尚未启动(已解决)。现在如何解决这个问题呢? 解决这个问题的唯一方法是排序包 顺便说一下,我用的是春分。

  • 当我跑的时候

  • 我在NetBeans平台(RCP)上开发了一个JavaSwing应用程序。我想将Windows JRE与NetBeans生成的安装程序一起包含,以防PC没有安装JRE,但我不知道如何做到这一点。我尝试按照以下说明操作,但失败了(我发现这些说明假设您完全了解JDK和JRE上的所有内容,例如,我会得到消息“pack 200”不被识别为内部或外部命令......似乎有些路径是错误的或过时的): 如何在安

  • 我编写了一个定制的NiFi处理器,它使用一些Hadoop类,处理流文件,并在Avro之间序列化流文件。 处理器的pom.xml文件如下所示: 因为我已经将标记为,所以它不会绑定在生成的NAR文件中。现在,我可以做一个快速修复,完全删除作用域并创建NAR,但NiFi会抱怨next class not found错误。 我想知道:

  • 我正在尝试使用为我的Java应用程序创建安装程序。我在Windows10上使用OpenJDK15.0.1。我应该能够使用 更新:我最初发布的问题发生在我使用--app image选项时,但它只使用基本命令。 这运行时没有错误,但生成的可执行文件无法完成。当我运行它时,一个窗口会短暂弹出并在我有时间阅读它之前消失,然后再也不会发生任何事情。它永远不会问“你想允许这个应用程序进行更改吗?”。然后,如果