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

当我运行生成的jar文件时,如何使我的Apache Derby数据库正常工作?

陈斌蔚
2023-03-14

我创建了一个JavaFX应用程序,并生成了一个将启动的Jar文件(使用Gradle生成)。

但是,当应用程序启动时,它不会连接到嵌入式数据库。我觉得我好像错过了一些非常简单的东西,但经过大量的研究,我无法弄清楚。从命令提示符运行 jar 文件时,我收到以下错误: java.lang.类不发现异常: org.apache.derby.jdbc.嵌入式驱动程序

从我所做的阅读中,我知道我可以将它添加到我的类路径中,但是在多次尝试后,我没有成功,我将这个应用程序运行在另一台计算机上。这是可能的吧?

如果可能的话,我想在我的build.gradle文件中修改一些东西,或者在。jar放在一个文件夹里,或者类似的地方,这对于运行程序的人来说会很简单。程序大小不是几千兆字节以下的问题。

共有2个答案

聂华翰
2023-03-14

Gradle所做的部分工作是依赖管理。这意味着它知道您需要什么依赖项以及如何找到它们(基于构建脚本中的配置)。当您通过Gradle执行/构建您的应用程序时,该工具将自动搜索存储库,下载缓存依赖项,并将这些依赖项放在类路径/模块路径上。一旦部署了JAR文件,Gradle就不再参与了,所以您的部署负责包含所需的依赖项。

换句话说,您需要将应用程序的依赖项与应用程序 JAR 文件一起提供。

基本上,您只需要确保您的应用程序包含了应用程序的依赖项。至少有三种方法可以做到这一点。

作为生成过程的一部分,将依赖项复制到生成文件夹中。下面是一个使用Kotlin DSL的任务示例:

tasks {
    val jar by existing(Jar::class)

    val copyDependencies by registering(Copy::class) {
        from(configurations.runtimeClasspath)
        into(jar.get().destinationDirectory)
    }

    jar.configure {
        finalizedBy(copyDependencies)
    }
}

现在如果执行< code >。/gradlew jar Gradle将创建jar文件,然后将依赖项复制到与JAR文件相同的目录中。然后,您只需要确保所有的JAR文件都部署在一起。

如果我没记错的话,默认的类路径是工作目录。但是要指定类路径,在执行应用程序时,您可以使用< code>-cp 、< code>-classpath或< code> - class-path。如果需要,可以用< code>-p或< code> - module-path设置模块路径。

创建一个所谓的“胖”或“超级”JAR文件。这是一个JAR文件,不仅包括您自己的应用程序代码,还包括您应用程序的所有依赖项。您可以为此配置jar任务,但简单地应用Gradle Shadow插件可能会更容易。

// Kotlin DSL
plugins {
    id("com.github.johnrengelman.shadow") version "<version>"
    // other plugins...
}

然后用< code >创建fat JAR。/gradlew shadowJar。有关更多信息,请参见用户指南。

使用像jpack这样的工具创建一个独立的可执行文件。该工具为您提供了一个嵌入了所有代码和JRE的应用程序,然后为您提供了一个安装程序或本机可执行文件(例如Windows上的exe)。这是jpack的用户指南。有Gradle插件可以使使用Gradle中的jpack变得更容易,例如The Badass JLink插件。

注意 jpackage 是在 Java 14 中添加的,并且一直在孵化,直到 Java 16。另请注意,jpackage不能“交叉打包”。也就是说,如果您在Windows上构建应用程序,那么您只能为Windows创建安装程序/可执行文件;与苹果操作系统和 Linux 相同。如果您需要打包多个平台,则需要访问每个平台。

既然您已经用JavaFX标记了这个问题,我想给出一个警告。但是如果您没有使用JavaFX 9,那么这与您无关。

从技术上讲,JavaFX只支持作为命名模块加载。这意味着需要通过< code> - module-path或者通过将它包含在由< code > jlink /< code > jpackage 构建的自定义运行时映像中,将它放在模块路径上。从JavaFX 16开始,如果从未命名的模块(即类路径)加载JavaFX,则会发出警告。

可执行JAR文件放在类路径中。这包括脂肪罐。如果您使用的不是包含JavaFX的JDK——这意味着您在JavaFX依赖项中有Gradle pull那么JavaFX将包含在您的fat JAR中,并放在class-path中。现在,尽管不被支持并发出警告,但是如果JavaFX在类路径上,似乎没有什么会中断。除了一个警告:您的主类不能是< code > Java FX . application . application 的子类。您必须创建一个单独的主类来启动JavaFX。

正因为如此,我强烈推荐使用< code>jpackage来部署JavaFX应用程序。你可能想看看这个问题

戚正业
2023-03-14

你有两个问题

  • 驱动类不在你的app jar
  • 如果您将该数据库嵌入到应用程序jar中,您将无法写入它

你可以做一个“胖罐子”,但这不会解决第二个问题。为此,您确实需要制作一个安装程序,以便将数据库保留在文件系统中,以便可以写入。

 类似资料:
  • 我做了一个简单的项目,其中包含一些测试,我希望能够在其他计算机上启动测试。我使用runas构建了这个项目- 错误:在com类中找不到Main方法。实例TestPurchase,请将main方法定义为:publicstaticvoidmain(String[]args)或JavaFX应用程序类必须扩展JavaFX。应用应用 据我所知,TestNG不需要任何主方法,因为有注释。这就引出了一些问题: 我

  • 我完成了我的程序,现在我正在尝试创建一个jar文件来运行它,但是当我尝试这样做时,什么都没有发生,没有错误,没有执行,没有任何事情。这是路径:D:\Eclipse\Workspace\Game\Src\AppPackage我编译了我的类D:\Eclipse\Workspace\Game\Src\AppPackage javac Game.java创建了我的清单和jar文件:echo main-cl

  • 我在1-2年前用libGDX做了一个游戏,我可以在eclipse上运行它,它很有效。当我想导出jar文件时,我转到Export-Runnable jar file-这里我选择package required libraries并导出它。

  • 我在我的Windows 7机器中以cronJob的身份运行一个批处理文件,我想要的只是我想创建一个日志文件,当cron Job与数据一起运行时,它显示在控制台中。数据是索引中存在的回显语句.php我已经导入到批处理文件中。帮我解决这个问题。索引.php 在批处理文件中,我调用索引。php文件如下C:\wamp\bin\php\php5.4.16\php。exe C:\wamp\www\Fed\cs

  • 目前,我正在java中建立一个Firebase云火力恢复,使用IntelliJ作为SDK。在Firebase留档中,据说需要服务帐户密钥,这是一个json文件。我使用FileInputStream方法获得这个json文件,当我得到执行程序的文件时,我没有任何问题,但是当我将其导出为JAR库时,使用该JAR的项目没有找到服务帐户密钥,然后它无法与我的Firebase连接。 现在,我可以连接到Fire