【问题标题】:Spring repackage is adding a duplicate copy of all spring jars in BOOT-INF/classesSpring 重新打包在 BOOT-INF/classes 中添加所有 spring jar 的副本
【发布时间】:2023-02-10 11:05:18
【问题描述】:

我最近将我的项目升级到spring-boot 2.7.0 版。升级后,当我运行我的 maven 配置文件的 jar 时,它会给我一个 invocationTargetException

Caused by: java.lang.reflect.InvocationTargetException
        at sun.reflect.GeneratedMethodAccessor1.invoke(Unknown Source)
        at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
        at java.lang.reflect.Method.invoke(Method.java:498)
        at org.springframework.boot.loader.MainMethodRunner.run(MainMethodRunner.java:49)
        at org.springframework.boot.loader.Launcher.launch(Launcher.java:108)
        at org.springframework.boot.loader.Launcher.launch(Launcher.java:58)
        at org.springframework.boot.loader.JarLauncher.main(JarLauncher.java:65)

我注意到我构建的 jar 现在包含 BOOT-INF/classes 目录中所有 org/springframework/boot/loader/ 库的副本。这是我通过运行 jar tvf jarfile 查看 jar 文件时看到的:

0 Wed Jun 29 20:06:28 PDT 2022 META-INF/
   492 Wed Jun 29 20:06:28 PDT 2022 META-INF/MANIFEST.MF
     0 Fri Feb 01 00:00:00 PST 1980 org/
     0 Fri Feb 01 00:00:00 PST 1980 org/springframework/
     0 Fri Feb 01 00:00:00 PST 1980 org/springframework/boot/
     0 Fri Feb 01 00:00:00 PST 1980 org/springframework/boot/loader/
  5871 Fri Feb 01 00:00:00 PST 1980 org/springframework/boot/loader/ClassPathIndexFile.class
  7675 Fri Feb 01 00:00:00 PST 1980 org/springframework/boot/loader/ExecutableArchiveLauncher.class
  2551 Fri Feb 01 00:00:00 PST 1980 org/springframework/boot/loader/JarLauncher.class
  1483 Fri Feb 01 00:00:00 PST 1980 org/springframework/boot/loader/LaunchedURLClassLoader$DefinePackageCallType.class
  1535 Fri Feb 01 00:00:00 PST 1980 org/springframework/boot/loader/LaunchedURLClassLoader$UseFastConnectionExceptionsEnumeration.class
 11154 Fri Feb 01 00:00:00 PST 1980 org/springframework/boot/loader/LaunchedURLClassLoader.class
  5932 Fri Feb 01 00:00:00 PST 1980 org/springframework/boot/loader/Launcher.class

...

     0 Wed Jun 29 20:06:28 PDT 2022 BOOT-INF/
     0 Wed Jun 29 20:06:28 PDT 2022 BOOT-INF/classes/
     0 Fri Feb 01 00:00:00 PST 1980 BOOT-INF/classes/org/
     0 Fri Feb 01 00:00:00 PST 1980 BOOT-INF/classes/org/springframework/
     0 Fri Feb 01 00:00:00 PST 1980 BOOT-INF/classes/org/springframework/boot/
     0 Fri Feb 01 00:00:00 PST 1980 BOOT-INF/classes/org/springframework/boot/loader/
  5871 Fri Feb 01 00:00:00 PST 1980 BOOT-INF/classes/org/springframework/boot/loader/ClassPathIndexFile.class
  7675 Fri Feb 01 00:00:00 PST 1980 BOOT-INF/classes/org/springframework/boot/loader/ExecutableArchiveLauncher.class
  2551 Fri Feb 01 00:00:00 PST 1980 BOOT-INF/classes/org/springframework/boot/loader/JarLauncher.class
  1483 Fri Feb 01 00:00:00 PST 1980 BOOT-INF/classes/org/springframework/boot/loader/LaunchedURLClassLoader$DefinePackageCallType.class
  1535 Fri Feb 01 00:00:00 PST 1980 BOOT-INF/classes/org/springframework/boot/loader/LaunchedURLClassLoader$UseFastConnectionExceptionsEnumeration.class
 11154 Fri Feb 01 00:00:00 PST 1980 BOOT-INF/classes/org/springframework/boot/loader/LaunchedURLClassLoader.class
  5932 Fri Feb 01 00:00:00 PST 1980 BOOT-INF/classes/org/springframework/boot/loader/Launcher.class

在我的pom.xml 中,我有一个针对特定配置文件的重新打包步骤:

<profile>
            <id>profileName</id>
            <plugin>
                <groupId>org.springframework.boot</groupId>
                <artifactId>spring-boot-maven-plugin</artifactId>
                <executions>
                  <execution>
                    <id>repackage</id>
                    <configuration>
                       <classifier>someName</classifier>
                    </configuration>
                  </execution>
                </executions>
            </plugin>
</profile>

此配置文件为我提供了损坏的罐子。在春季升级之前,它甚至在重新打包步骤中也能正常工作,所以一定发生了一些变化。如何避免我的 jar 中出现重复的 spring boot 库?

【问题讨论】:

  • 您正在使用配置文件,您是否通过任何更改也配置了 maven jar 插件?或者常规构建部分中的另一个spring-boot-maven-plugin?简而言之,这里的信息似乎太少了,请添加您的完整构建文件。并尝试使用 Spring Boot 2.7.1(不久前发布)。

标签: java spring spring-boot maven jar


【解决方案1】:

请生成Maven effective POM并搜索repackage,你可以找到两个具有repackage目标但执行id不同的执行,这意味着repackage将被执行两次因此那些spring boot类将被打包2次。在第二次执行时,它将把第一次运行时添加的那些 spring boot 类当作普通的应用程序类,并将它们添加到 BOOT-INF/classes 中。

如果您使用 spring-boot-starter-parent 版本 2.1.0 或更高版本,则不应发生这种情况,重新打包 ID 是从版本 2.1.0 开始预定义的。目标将只运行一次,因为您在 POM 中引用了相同的 ID。在2.1.0版本之前,预配置了一个repackage goal,但没有配置repackage id,因此2次执行会运行2个repackage goal。

考虑到您使用的是 2.7.0,可能您的 POM 中的某些依赖项引入了额外的重新打包目标,但具有不同的执行 ID。

可以参考Spring Boot Maven插件文档https://docs.spring.io/spring-boot/docs/current/maven-plugin/reference/htmlsingle/#packaging

【讨论】:

    猜你喜欢
    • 2017-03-26
    • 1970-01-01
    • 2020-11-03
    • 2017-02-17
    • 2015-06-10
    • 1970-01-01
    • 2018-02-03
    • 2017-01-16
    • 2019-07-05
    相关资源
    最近更新 更多