You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

命令行运行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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.18 19:13:12