(我最初在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
答案 0 :(得分:0)
Spring Boot可执行JAR目前不支持zip64格式。我建议尝试重新构建您的应用程序,以便将资产打包成不同的嵌套JAR(常规zip格式,其中包含< 65535文件)。或者,您可以使用Gradle shadow plugin重新打包您的应用。