【问题标题】:Cannot run the war generated from Gradle BootRepackage in a JHipster-based web Application无法在基于 JHipster 的 Web 应用程序中运行从 Gradle BootRepackage 生成的战争
【发布时间】:2015-04-24 12:54:42
【问题描述】:

我正在尝试使用java -jar 运行./gradlew -Pprod bootRepackage 生成的war 文件。 bootRepackage 任务成功结束。

当我查看project_root/build/libs/ 文件夹时,使用以下权限创建了war 和war.original 文件:

-rw-rw-r-- 1 user user 110376521 Apr 24 09:42 app-0.1-SNAPSHOT.war
-rw-rw-r-- 1 user user 107542786 Apr 24 09:40 app-0.1-SNAPSHOT.war.original

在我的 build.gradle 中,我有以下内容:

apply plugin: 'java'
apply plugin: 'maven'
apply plugin: 'spring-boot'
apply plugin: 'war'

bootRepackage {
    mainClass = 'org.package.Application'
}

// Original from JHipster. Uncommenting this does not work either.
//springBoot {
//    mainClass = 'org.package.Application'
//}

// I got this from [this][1] questions, but did not work either.
war {
    baseName = 'app'
    version =  '0.1-SNAPSHOT'
    manifest {
        attributes 'Main-Class': 'org.package.Application'
    }
}

当我运行 jar 时,我得到:

$ java -jar app-0.1-SNAPSHOT.war --spring.profiles.active=prod
java.lang.IllegalStateException: No 'Start-Class' manifest entry specified in jar:file:/home/user/.../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:63)
        at org.springframework.boot.loader.Launcher.launch(Launcher.java:61)
        at org.springframework.boot.loader.WarLauncher.main(WarLauncher.java:80)

我该怎么办?谢谢。

更新 我解压缩了战争并查看了 MANIFEST.MF:

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

我说的对吗?

【问题讨论】:

  • 为什么清单主类设置为 Main-Class: org.springframework.boot.loader.WarLauncher 当你将它设置为属性'Main-Class': 'org.package.Application'? ??
  • @al-Jacinto 这很奇怪,但在线阅读更多内容我相信我有一个解释。这是因为 Spring Boot 是 JDK 必须运行的第一个类才能使应用程序运行。 Spring boot 必须运行 Web 服务器等,然后是我自己的类。我只是不知道为什么它没有在 jar 中创建 Start-Class
  • 好吧,不知道这是弹簧靴。您应该更改 Start-Class 而不是 main-class 因为就像您说的那样,spring-boot 将启动它。这来自我相信的参考文档(不记得我在哪里得到它):您需要指定一个适当的启动器作为 META-INF/MANIFEST.MF 的 Main-Class 属性。您要启动的实际类(即您编写的包含 main 方法的类)应在 Start-Class 属性中指定。主类:org.springframework.boot.loader.WarLauncher 开始类:com.mycompany.project.MyApplication
  • 看看你的错误,这正是它所说的:)并且清单具有 Start-Class 属性的默认值。
  • 我知道,但是 MANIFEST.MF 中的 Start-Class 是正确的!这就是重点。

标签: java gradle spring-boot jhipster


【解决方案1】:

这是可以工作的 build.gradle,bootRepackage 被注释掉了:

buildscript {
    repositories {
        mavenCentral()
                        }
    dependencies {
        classpath("org.springframework.boot:spring-boot-gradle-plugin:1.2.3.RELEASE")
    }
}

apply plugin: 'java'
apply plugin: 'maven'
apply plugin: 'spring-boot'
apply plugin: 'war'

repositories {
    mavenCentral()
}


dependencies {
    compile("org.springframework.boot:spring-boot-starter-web")
}

//bootRepackage {
//    mainClass = 'org.package.Application'
//    }

war {
    baseName = 'app'
    version =  '0.1-SNAPSHOT'
    manifest {
        attributes 'Main-Class': 'org.package.Application'
    }
}

MANIFEST.INF 中的差异

> libs  diff META-INF/MANIFEST.MF ~/temp/MANIFEST-MF-works 
2c2
< Start-Class: org.package.Application
---
> Start-Class: Application

在行动

> sample        /opt/java/bin/java -jar build/libs/app-0.1-SNAPSHOT.war

  .   ____          _            __ _ _
 /\\ / ___'_ __ _ _(_)_ __  __ _ \ \ \ \
( ( )\___ | '_ | '_| | '_ \/ _` | \ \ \ \
 \\/  ___)| |_)| | | | | || (_| |  ) ) ) )
  '  |____| .__|_| |_|_| |_\__, | / / / /
 =========|_|==============|___/=/_/_/_/
 :: Spring Boot ::        (v1.2.3.RELEASE)

2015-04-24 18:44:55.443  INFO 18776 --- [           main] Application                              : Starting Application on vagrant-ubuntu-trusty-64 with PID 18776 (started by developer in /home/developer/developments/gradle-sandbox/sample)

【讨论】:

  • 摆脱包也可以 mainClass = 'Application'
  • 你能用 Spring Boot 1.1.7 检查这个吗?我注释掉了 bootRepackage 并将清单属性设置为 org.package.Application 并且也只设置为 Application,但仍然得到相同的错误。我也会在这里试试。
  • 也适用于该版本:: Spring Boot :: (v1.1.7.RELEASE)
  • 我运行了你的迷你示例,并且能够 java -jar 也生成了战争。但是在我完整的 gradle.build 应用程序中它没有用。明天我会生成一个完整的 jHipster 应用程序,看看它是否能正常运行。
  • 我认为我的问题与我在 war{ } 中使用的 zip64 属性有关。当我创建一个新应用程序时,我可以完美地运行生成的战争。但是,当我开始添加我需要的依赖项(和代码)时,有时它找不到启动类。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-01-23
  • 1970-01-01
  • 2017-12-21
  • 2020-08-19
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多