java - Gradle 2.3-Zip64 = true的BootRepackage找不到Start-Class

标签 java spring gradle spring-boot

(我最初将其发布在Gradle Forum中,但由于我认为SO具有更高的可见性,因此我在此处进行了复制)。

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

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

然后,我将 zip64 属性设置为 true (我也必须在jar {}任务中进行此操作。但是在我的原始应用程序中,我没有jar任务,仅在war任务中进行了设置)。 bootRepackage任务成功完成,但是当我进行 war 时,我得到,没有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,然后尝试再次将其打包

Set zip64 = true in build.gradle in jar and war tasks. ./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)

最佳答案

Spring Boot可执行JAR当前不支持zip64格式。我建议尝试重组您的应用程序,以便将 Assets 打包到不同的嵌套JAR(具有<65535个文件的常规zip格式)中。或者,您可以使用Gradle shadow plugin重新打包您的应用程序。

关于java - Gradle 2.3-Zip64 = true的BootRepackage找不到Start-Class,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29929376/

相关文章:

java - 计算测试类中的行数

java - 有没有一种方法可以在围绕连接点的 AOP 之前进行一次性处理,以使我的方面性能更高?

java - 如何通过休息调用使用输入表单获取数据?

java - Spring Boot 中的 Redis,保留 redis 模板

android - 我如何将Gradle降级到4.10.1

java - 归并排序示例

java - 如何在 Java 中修复 'Date Time Parse Exception'

gradle:排除所有 - 除了一个文件

java - Firebase 查询列表<String> "contains"值

android-studio - 如何检测AndroidStudio项目的build.gradle中何时存在依赖库版本更新