【发布时间】:2015-07-07 21:23:45
【问题描述】:
(我最初在 Gradle Forum 上发布了这个,但我在这里复制它,因为我认为 SO 有更多的可见性)。
我无法在从 jHipster 框架派生的项目中执行从 bootRepackage 生成的 war。话题还在Stackoverflow开启。
我创建了一个小应用程序并将其放在Github 上,以帮助您解决这个问题。按照这些步骤,我相信您也可以重现该问题。我首先打包一个简单的 Spring 应用程序,然后运行生成的战争。这将在资源文件夹中创建 66000 个文件。再次打包同一个应用程序会失败,因为第二次有超过 65535 个文件。我们通过清理资源文件夹并再次启动重新打包成功确认了这一点。
然后我将 zip64 属性设置为 true (我也必须在 jar { } 任务中这样做。在我的原始应用程序中但是我没有jar任务,只在war任务中设置)。 bootRepackage 任务成功完成,但是当我运行战争时,我得到 no Start-Class 错误。
第一次运行它会起作用,因为总文件
./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
第三次运行它(等于替代一次)将起作用,因为总文件
rm src/main/resources/*; ./gradlew clean boot重新打包; java -jar build/libs/app-0.1-SNAPSHOT.war
此时我们的文件总数 > 65535 且 zip64 = false。我们将 zip64 属性更改为 true 并尝试再次 bootPackage
在 jar 和 war 任务的 build.gradle 中设置 zip64 = true。 ./gradlew clean boot重新打包; 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
最好的问候,
佩德罗·杜索
【问题讨论】:
标签: java spring gradle spring-boot