为依赖于其他项目的spring启动应用程序创建胖jar时发生异常
这是我上一个问题的后续问题 我有一个HttpServlet应用程序,它是一个多项目的gradle构建,其中我的项目是一个包含gradle HttpServlet项目,它依赖于另外两个GradleJava项目。我在tomcatwebapps/webinf/lib目录中部署了所有3个jar并运行它 现在有一个要求,我必须将我的应用程序转换为spring引导应用程序,而不是3个独立的jar,我必须创建一个胖jar,我应该运行它 我的代码安排如下为依赖于其他项目的spring启动应用程序创建胖jar时发生异常,spring,spring-boot,gradle,spring-boot-gradle-plugin,Spring,Spring Boot,Gradle,Spring Boot Gradle Plugin,这是我上一个问题的后续问题 我有一个HttpServlet应用程序,它是一个多项目的gradle构建,其中我的项目是一个包含gradle HttpServlet项目,它依赖于另外两个GradleJava项目。我在tomcatwebapps/webinf/lib目录中部署了所有3个jar并运行它 现在有一个要求,我必须将我的应用程序转换为spring引导应用程序,而不是3个独立的jar,我必须创建一个胖jar,我应该运行它 我的代码安排如下 Rootrepository -
Rootrepository
- settings.gradle
- build.gradle
- Springboot project
- build.gradle
-src….
- OtherGardleProject1
- Src…
- OtherGardleProject2
- Src…
Please see `root project’s build.gradle`
version = '1.0.0'
group = ‘myproj’
apply plugin: 'java'
apply plugin: 'idea'
apply plugin: 'groovy'
apply plugin: 'eclipse'
subprojects {
repositories {
mavenCentral()
}
}
apply plugin: 'java'
sourceCompatibility = 1.8
compileJava
jar {
from sourceSets.main.allSource
}
}
subprojects.each { subproject ->
evaluationDependsOn(subproject.path)
}
task mmJar(type: Jar, dependsOn: subprojects.jar) {
manifest {
attributes 'Main-Class': 'org.springframework.boot.loader.JarLauncher'
attributes 'Start-Class': ‘mypackage.springboot.Application'
}
subprojects.each { subproject ->
from subproject.configurations.archives.artifacts.files.collect {
zipTree(it)
}
}
}
dependencies {
compile 'junit:junit:4.12'
compile 'org.slf4j:slf4j-api:1.7.7'
}
请参见springboot项目的build.gradle
buildscript {
ext {
spring_plugin_version = '2.1.1.RELEASE'
}
repositories {
mavenCentral()
}
dependencies {
classpath("org.springframework.boot:spring-boot-gradle-plugin:$spring_plugin_version")
classpath "io.spring.gradle:dependency-management-plugin:1.0.3.RELEASE"
}
}
apply plugin: 'org.springframework.boot'
apply plugin: 'io.spring.dependency-management'
dependencies {
implementation('org.springframework.boot:spring-boot-starter-quartz')
implementation('org.springframework.boot:spring-boot-starter-web')
compile project(‘:otherproject1’)
compile group: 'com.googlecode.json-simple', name: 'json-simple', version: '1.1'
compile group: 'commons-io', name: 'commons-io', version: '2.4'
compile('org.springframework:spring-webmvc')
runtimeOnly('org.springframework.boot:spring-boot-devtools')
compileOnly('org.projectlombok:lombok:1.18.8')
annotationProcessor('org.projectlombok:lombok:1.18.8')
testCompile('org.springframework.boot:spring-boot-starter-test')
}
然后我运行了gradlecleanmassemblemmjar
,它按照预期创建了一个胖jar
但是当我尝试运行java-jarbuild/libs/myproj-1.0.0.jar
Exception in thread "main" java.lang.IllegalStateException: Failed to get nested archive for entry BOOT-INF/lib/JavaEWAH-1.1.6.jar
at org.springframework.boot.loader.archive.JarFileArchive.getNestedArchive(JarFileArchive.java:108)
at org.springframework.boot.loader.archive.JarFileArchive.getNestedArchives(JarFileArchive.java:86)
at org.springframework.boot.loader.ExecutableArchiveLauncher.getClassPathArchives(ExecutableArchiveLauncher.java:70)
at org.springframework.boot.loader.Launcher.launch(Launcher.java:49)
at org.springframework.boot.loader.JarLauncher.main(JarLauncher.java:51)
Caused by: java.io.IOException: Unable to open nested jar file 'BOOT-INF/lib/JavaEWAH-1.1.6.jar'
at org.springframework.boot.loader.jar.JarFile.getNestedJarFile(JarFile.java:256)
at org.springframework.boot.loader.jar.JarFile.getNestedJarFile(JarFile.java:241)
at org.springframework.boot.loader.archive.JarFileArchive.getNestedArchive(JarFileArchive.java:103)
... 4 more
Caused by: java.lang.IllegalStateException: Unable to open nested entry 'BOOT-INF/lib/JavaEWAH-1.1.6.jar'. It has been compressed and nested jar files must be stored without compression. Please check the mechanism used to create your executable jar file
at org.springframework.boot.loader.jar.JarFile.createJarFileFromFileEntry(JarFile.java:284)
at org.springframework.boot.loader.jar.JarFile.createJarFileFromEntry(JarFile.java:264)
at org.springframework.boot.loader.jar.JarFile.getNestedJarFile(JarFile.java:252)
... 6 more
有人能告诉我我做错了什么吗?正如@M.Deinum和我在链接帖子中建议的那样,让spring boot gradle插件来完成这项工作。在根文件夹中保留
settings.gradle
文件,并删除build.gradle
。跑
gradle clean build
在
Rootrepository
文件夹中。Gradle将构建设置中包含的项目。Gradle
并在Springboot项目/build/libs
文件夹中创建fatjar使用Spring Boot创建fatjar不要自己动手。Spring Boot已经创建了一个包含所有内容的可执行fatjar,您正试图将其插入另一个fatjar。您是说我在root build.gradle中的mmJar不是正确的方法吗?你能用我的两个gradle文件把它作为答案发布吗?你的Spring Boot(子)项目是fatjar。。。您不需要任何其他内容。我删除了根项目中的build.gradle并运行了./gradlew bootJar,然后在第二个项目构建文件“Otherproject1/build.gradle”行中出现错误:2*出现了什么问题:评估项目时出现问题:Otherproject1'>在类型为org.gradle.api.internal.artifacts.dsl.dependencies.DefaultDependencyHandler的对象上找不到参数[{group=com.google.guava,name=guava,version=18.0}]
的方法compile()。请参阅其他项目1/build.gradle DependencyHandler的build.gradle{编译组:'com.google.guava',名称:'guava',版本:'18.0'编译'org.slf4j:slf4j api:1.7.7'编译'com.fasterxml.jackson.dataformat:jackson数据格式yaml:2.9.5'编译'com.fasterxml.jackson.core:jackson数据绑定:2.9.5'编译'org.apache.commons:commons-lang3:3.4'测试编译'junit:junit:4.11'}我太傻了。忘了在第二个项目的build.gradleyes中添加apply插件“java”,它解决了问题。我检查了fat jar(jar tf myspringboot.jar)的内容,我可以在其中看到我的otherproject1.jar