成分
- Spring Boot 1.4.3(也尝试过使用 Spring Boot 1.5 RC1)
- Mac OS Sierra 上的 Java 1.8.0_112
- 摇篮 3.3 / Maven 3.3.9
- 使用 Spring Boot Gradle 插件配置的简单 Java Web 应用程序(同样的问题似乎也适用于 Spring Boot Maven 插件)
问题
尝试通过之类的方法运行应用程序,gradlew clean build bootRun
或者只是gradlew bootRun
表明 gradle/java 进程在没有任何提示的情况下悲惨地退出/崩溃。除以下内容外,不会显示更多错误或日志:
“/Library/Java/JavaVirtualMachines/jdk1.8.0_112.jdk/Contents/Home/bin/java 以非零退出值 1 完成”。
然而,运行gradlew bootRun --debug
表明 BootRun(Gradle 的 JavaExec 的扩展)任务似乎想要生成一个非常非常长的 Classpath 条目,最终会破坏 Java 进程。
Spring Boot 文档指定:
要在不构建 jar 的情况下就地运行项目,您可以使用“bootRun”任务
但是如果插件要生成这么长的类路径,这种方法似乎不起作用。
复制
这里的这个项目可能会证明这个问题:
https://github.com/apereo/cas-gradle-overlay-template
在cas/build.gradle
文件中,可以添加一个依赖项来观察行为:
compile "org.apereo.cas:cas-server-support-json-service-registry:${project.'cas.version'}"
诊断
该项目包含以下依赖项:
dependencies {
compile "somewhere:something:somehow@war"
}
这对bootRun
;完全没有问题。但是,当任何其他编译/运行时依赖项添加到项目中时,所有可传递或其他依赖项都将添加到类路径中bootRun
以执行。
我还尝试创建一个“路径”JAR,希望插件/Java 可以简单地使用该Class-Path
JAR 清单中的条目来运行 Web 应用程序,并且传递给 java 命令的类路径条目将被缩短。然而,这并没有产生任何影响,java 再次崩溃了。
请注意,将 Web 应用程序作为可执行 jar 运行,java -jar app.war
与所有依赖项等完美配合。
其他人是否遇到过类似的问题?