我使用Gradle的badass-jlink-plugin将java、我的JavaFX应用程序及其依赖项组装成一个工件--自定义运行时--这样我就只能共享zip
文件。
我为我的问题创建了一个MWE,它可以在下面找到:https://github.com/victoratpl/jlink_badass_flyway_classpath_problem
执行此插件的PrepareModuleSDIR
任务后,在build/jlinkbase/jlinkjars
中有以下JAR
:
有关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 jlink
和jimage 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时不能查找目录?
我会很感激有人给我指路。
不确定为什么在这两种情况下它的行为不同,但是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(早期版本)的
问题内容: 我想使用html applet标记在我的Web应用程序中运行简单applet,但是它给出了类似的错误 java.lang.ClassNotFoundException:MyApplet 请给我示例应用程序,如果可能的话..... 问题答案: 问题是applet引擎在您定义的代码库中找不到MyApplet类。 这是因为您在/ WEB-INF / classes目录中进行了分类。该目录受s
我是这个领域的新手。我正在制作一个简单的Spring Boot应用程序,它调用另一个API,编辑内容并在客户端返回数据。因此,我希望只有当URL位于配置文件(application.yml)中时,才可以从应用程序调用新API 例如,如果应用程序。yml是 如果我试图在代码中创建一个新的请求映射(http://api3.com/),它将不会返回任何东西,或者无论如何都不可能。有办法吗?