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

Flyway只有在用jlink组装应用程序后运行应用程序时才能在类路径中找到迁移

葛航
2023-03-14

我使用Gradle的badass-jlink-plugin将java、我的JavaFX应用程序及其依赖项组装成一个工件--自定义运行时--这样我就只能共享zip文件。

我为我的问题创建了一个MWE,它可以在下面找到:https://github.com/victoratpl/jlink_badass_flyway_classpath_problem

执行此插件的PrepareModuleSDIR任务后,在build/jlinkbase/jlinkjars中有以下JAR:

    null

有关badass-jlink-plugin如何工作的更多信息,请参见以下文档:https://badass-jlink-plugin.beryx.org/releases/latest/#_how_it_works

应用程序的主模块包含资源(.sql文件在src/main/resources/db/migration中)和类(.java文件在src/main/java/db/migration中),它们是Flyway库的迁移。

如果我使用jlink任务(./jlink.sh脚本)创建自定义运行时映像,并使用系统安装的java运行应用程序(run_system_java.sh,它执行/usr/lib/jvm/java-11-oracle/bin/java--module-path/usr/lib/jvm/java-11-oracle/jmods/:./build/jlinkjars--module jlinkbase/jlinkjars--module

如果我使用自定义创建的运行时(./run_assembled_java.sh,它执行./build/image/bin/java-m jlink_badass_flyway_classpath_problem/app.main)运行应用程序,我会得到以下警告:

Jan 24, 2020 8:22:38 PM org.flywaydb.core.internal.scanner.classpath.ClassPathScanner findResourceNames
WARNING: Unable to resolve location classpath:db/migration

因此,在badass-jlink-plugin执行jlink时,会出现一些问题,因为在为自定义运行时创建modules文件后,找不到db/migration

这是由jlink任务执行的命令:

/usr/lib/jvm/java-11-oracle/bin/jlink -v --compress 2 --no-header-files --no-man-pages --module-path /usr/lib/jvm/java-11-oracle/jmods/:/home/piotr/IdeaProjects/jlink_badass_flyway_classpath_problem/build/jlinkbase/jlinkjars --add-modules jlink_badass_flyway_classpath_problem --output /home/piotr/IdeaProjects/jlink_badass_flyway_classpath_problem/build/image

我还附上了gradle jlinkjimage list build/image/lib/modules:https://gist.github.com/victoratpl/69e50e1738429548d1e6d8070e37b062

我认为它这样做的主要原因是Flyway的classpathscanner.java中的这一行在使用不同的Java(system-installed和jlink创建的自定义运行时)运行时的行为不同。

在第一个场景中,它找到一个URL:jar:file://home/piotr/ideaprojects/jlink_badass_flyway_classpath_problem/build/jlinkbase/jlinkjars/jlink_badass_flyway_classpath_problem-0.1.0-alpha.jar!/db/migration/,在第二个场景中,它没有(classloader.getresources(“db/migration”)。NextElement()起作用)。

我认为classLoader在使用java自定义运行时的模块时存在一些问题。为什么在使用基于JRT的URL时不能查找目录?

我会很感激有人给我指路。


共有1个答案

宋高谊
2023-03-14

不确定为什么在这两种情况下它的行为不同,但是Flyway的ClassPathScanner会找到资源,如果您将它们放在类路径上。为此,可以复制映像的子目录中的资源,并将该子目录添加到类路径中:

tasks.jlink {
    doLast {
        copy {
            from 'src/main/resources'
            into "$imageDir/bin/data"
        }
    }
}

jlink {
    ...
    launcher {
        ...
        jvmArgs = ['-cp', '$DIR/data/']
    }
}

我将上述更改作为pull请求提交给MW:https://github.com/victoratpl/jlink_badass_flyway_classpath_problem/pull/1

 类似资料:
  • 我有一个带有几个实体类的Spring Boot应用程序,我正在尝试用Flyway实现数据库迁移。在启动时,似乎Spring Boot根本没有运行flyway。 这是我的应用程序.属性 这是我的建筑里的线.Gradle和flyway有关

  • 问题内容: 我有一个现有的Flask应用程序,并且想找到通往另一个应用程序的路线。更具体地说,第二个应用程序是Plotly Dash应用程序。如何在现有的Flask应用程序中运行Dash应用程序? 我还尝试将路由添加到Dash实例,因为它是Flask应用程序,但出现错误: 问题答案: 从文档: 基本的Flask应用程序可从访问app.server。 你还可以将自己的Flask应用实例传递到Dash

  • 我试图在SpringMVC中运行SpringBoot应用程序,在SpringMVCPOM中添加SpringBoot应用程序依赖项,并扫描SpringBoot包,但我面临以下问题

  • 我使用Hibernate将Roo生成的SpringMVC应用程序连接到PostgreSQL。我试图将Flyway1.6作为一个bean集成到Spring应用程序上下文中。“有什么东西阻止”迁移的执行,我在上下文初始化时遇到了由Hibernate元数据验证引起的错误。使用Flyway 1.6 Maven插件(clean、init、migrate)执行迁移没有问题。 Flyway 1.5(早期版本)的

  • 我是这个领域的新手。我正在制作一个简单的Spring Boot应用程序,它调用另一个API,编辑内容并在客户端返回数据。因此,我希望只有当URL位于配置文件(application.yml)中时,才可以从应用程序调用新API 例如,如果应用程序。yml是 如果我试图在代码中创建一个新的请求映射(http://api3.com/),它将不会返回任何东西,或者无论如何都不可能。有办法吗?

  • 问题内容: 我想使用html applet标记在我的Web应用程序中运行简单applet,但是它给出了类似的错误 java.lang.ClassNotFoundException:MyApplet 请给我示例应用程序,如果可能的话..... 问题答案: 问题是applet引擎在您定义的代码库中找不到MyApplet类。 这是因为您在/ WEB-INF / classes目录中进行了分类。该目录受s