Gradle 2.3 - 使用Zip64 = true的BootRepackage无法找到Start-Class

时间:2015-04-28 20:33:23

标签: java spring gradle spring-boot

(我最初在Gradle Forum发布了这个,但我在这里复制了它,因为我认为SO的可见性更高。)

我无法在从jHipster框架派生的项目中执行从 bootRepackage 生成的 war 。该主题仍在Stackoverflow中打开。

我创建了一个小应用程序并将其放在Github上以帮助您解决此问题。按照这些步骤,我相信你也可以重现这个问题。我首先打包一个简单的Spring应用程序,然后运行生成的war。这将在资源文件夹中创建66000个文件。再次打包相同的应用程序将失败,因为第二次有超过65535个文件。我们通过清理资源文件夹并再次成功启动了bootRepackaging来确认这一点。

然后我将 zip64 属性设置为 true (我必须在 jar {} 任务中执行此操作。在我的原始应用程序中但是我没有jar任务,只在战争任务中设置)。 bootRepackage任务成功完成,但是当我运行war时,我得到 no Start-Class错误

第一次运行它将起作用,因为总文件< 65535和zip64 = false

  

./ gradlew clean bootRepackage; java -jar build / libs / app-0.1-SNAPSHOT.war

第二次运行此功能将无效,因为总文件> 65535和zip64 = false

  

./ gradlew clean bootRepackage; java -jar build / libs / app-0.1-SNAPSHOT.war

第三次运行它(等于另一个)将起作用,因为总文件< 65535和zip64 = false

  

rm src / main / resources / *; ./gradlew clean bootRepackage; java -jar build / libs / app-0.1-SNAPSHOT.war

此时我们有总文件> 65535和zip64 = false。我们将zip64属性更改为true并再次尝试bootPackage

  

在jar和war任务中的build.gradle中设置zip64 = true。   ./gradlew clean bootRepackage; java -jar build / libs / app-0.1-SNAPSHOT.war

java.lang.IllegalStateException: No 'Start-Class' manifest entry specified in jar:file:../boot-repackage-test/build/libs/app-0.1-SNAPSHOT.war!/
        at org.springframework.boot.loader.archive.Archive.getMainClass(Archive.java:57)
        at org.springframework.boot.loader.ExecutableArchiveLauncher.getMainClass(ExecutableArchiveLauncher.java:69)
        at org.springframework.boot.loader.Launcher.launch(Launcher.java:61)
        at org.springframework.boot.loader.WarLauncher.main(WarLauncher.java:61)

总而言之,unzip app-0.1-SNAPSHOT.war && cat META-INF/MANIFEST.MF产生:

Manifest-Version: 1.0
Start-Class: org.Application
Spring-Boot-Version: 1.2.3.RELEASE
Main-Class: org.springframework.boot.loader.WarLauncher

致以最诚挚的问候,

Pedro Dusso

1 个答案:

答案 0 :(得分:0)

Spring Boot可执行JAR目前不支持zip64格式。我建议尝试重新构建您的应用程序,以便将资产打包成不同的嵌套JAR(常规zip格式,其中包含< 65535文件)。或者,您可以使用Gradle shadow plugin重新打包您的应用。