命令行运行Maven Swing Jar无法创建Derby表,NetBeans运行正常如何解决?
解决命令行运行Maven Shade打包Jar时Flyway Derby迁移失败问题
核心问题分析
IDE内运行正常但命令行打包后迁移失败,大概率是打包时资源文件未正确包含、迁移文件命名未严格符合Flyway规范,或是Flyway路径配置在Jar环境下失效这几个原因。
具体排查与解决步骤
1. 检查迁移文件是否被正确打进Jar包
IDE运行时Flyway直接读取项目里的src/main/resources/db/migration脚本,但maven-shade-plugin默认可能没把这些资源文件完整打包。
- 修改shade插件配置,强制包含资源文件:
<plugin> <groupId>org.apache.maven.plugins</groupId> <artifactId>maven-shade-plugin</artifactId> <version>3.5.1</version> <executions> <execution> <phase>package</phase> <goals> <goal>shade</goal> </goals> <configuration> <transformers> <transformer implementation="org.apache.maven.plugins.shade.resource.ManifestResourceTransformer"> <mainClass>你的主类全限定名</mainClass> </transformer> <!-- 避免资源文件冲突覆盖 --> <transformer implementation="org.apache.maven.plugins.shade.resource.ServicesResourceTransformer"/> </transformers> <!-- 明确包含resources目录下所有文件 --> <includeResources> <includeResource> <directory>src/main/resources</directory> <filter>**/*</filter> </includeResource> </includeResources> </configuration> </execution> </executions> </plugin> - 打包后解压Jar包,确认
db/migration目录存在,且里面的迁移脚本完整。
2. 严格校验迁移文件命名格式
Flyway对命名的要求非常严格,IDE可能会忽略小错误,但命令行下会直接报错:
- 必须遵循
V<版本号>__<描述>.sql格式,重点是版本号和描述之间是两个下划线,比如V1__create_warehouse_table.sql是正确的,V1_create_warehouse_table.sql(单下划线)或V1.1__table.sql(版本号带小数点)都会触发错误。 - 看日志里的具体报错,定位到违规的文件名,直接修改即可。
3. 修正Flyway的资源路径配置
如果是代码里手动初始化Flyway,要确保用类路径读取Jar内的脚本,别用相对路径:
Flyway flyway = Flyway.configure() .dataSource("jdbc:derby:warehouse;create=true", "", "") .locations("classpath:db/migration") // 必须用classpath前缀,确保从Jar内读取 .load(); flyway.migrate();
命令行运行时的工作目录和IDE不一样,用相对路径会找不到脚本,必须用classpath:开头的路径。
4. 处理Derby与Shade的类加载冲突
Shade打包可能导致Derby的类加载异常,在插件配置里添加过滤器和转换器:
<configuration> <filters> <filter> <artifact>org.apache.derby:*</artifact> <includes> <include>**/*</include> </includes> </filter> </filters> <transformers> <transformer implementation="org.apache.maven.plugins.shade.resource.ServicesResourceTransformer"/> </transformers> </configuration>
验证流程
- 执行
mvn clean package重新打包,解压Jar确认资源文件和脚本无误。 - 命令行运行
java -jar warehouse-box-1.0-SNAPSHOT.jar,查看Flyway日志的详细错误,针对性调整。 - 如果还是报错,把日志里的具体错误信息贴出来,进一步定位。
内容的提问来源于stack exchange,提问作者Saleh Rezq
相关产品推荐
相关产品推荐

