Это продолжение моего предыдущего вопроса Преобразование проекта Gradle Multi в приложение Springboot Fat jar
У меня было приложение HTTP-сервлета, которое представляло собой многопроектную сборку Gradle, где мой проект был проектом HttpServlet, содержащим Gradle, и он зависит от двух других проектов Gradle Java. Я развернул все 3 jar-файла в каталоге tomcat webapps/Web-INF/lib и запустил их.
Теперь есть требование, чтобы я преобразовал свое приложение в приложение с весенней загрузкой, и вместо трех отдельных банок я должен создать толстую банку, которую я должен запустить.
Я расположил свой код следующим образом
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 projects’ 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')
}
Затем я запустил gradle clean assemble mmJar
, и он, как и ожидалось, создал толстую банку.
Но когда я пытаюсь бежать java -jar build/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
Может кто-нибудь предложить, что я делаю неправильно?
Вы имели в виду, что мой mmJar в корневом build.gradle неправильный путь? Не могли бы вы опубликовать это как ответ, используя два моих файла gradle?
Ваш проект Spring Boot (sub) IS Fatjar... Вам больше ничего не нужно.
Как было предложено @M.Deinum и мной в связанном посте, просто позвольте плагину Spring Boot Gradle выполнить эту работу. В корневой папке сохраните файл settings.gradle
и удалите файл build.gradle
. Бегать
gradle clean build
в папке Rootrepository
. Gradle соберет проекты, включенные в settings.gradle
, и создаст толстую банку в папке Springboot project/build/libs
.
Я удалил build.gradle в корневом проекте и запустил ./gradlew bootJar. Затем я получил ошибку во втором проекте Строка файла «Otherproject1/build.gradle»: 2 * Что пошло не так: возникла проблема при оценке проекта «: Otherproject1». > Не удалось найти метод compile() для аргументов [{group=com.google.guava, name=guava, version=18.0}]
объекта типа org.gradle.api.internal.artifacts.dsl.dependencies.DefaultDependencyHandler.
См. build.gradle зависимостей Otherproject1/build.gradle {группа компиляции: 'com.google.guava', имя: 'guava', версия: '18.0' compile 'org.slf4j:slf4j-api:1.7.7' скомпилировать 'com.fasterxml.jackson.dataformat:jackson-dataformat-yaml:2.9.5' скомпилировать 'com.fasterxml.jackson.core:jackson-databind:2.9.5' скомпилировать 'org.apache.commons:commons- lang3:3.4' testCompile 'junit:junit:4.11' }
Я был глуп. Забыл добавить плагин «java» для второго проекта build.gradle
да, это решило проблему. Я проверил содержимое толстой банки ( jar tf myspringboot.jar ), и я вижу, что мой otherproject1.jar в этом
Используйте Spring Boot для создания Fatjar, не делайте этого сами. Spring Boot уже генерирует исполняемый фатжар, содержащий все, вы пытаетесь втиснуть его в другой фатжар.