Исключение при создании толстой банки для весеннего загрузочного приложения, которое зависит от другого проекта

Это продолжение моего предыдущего вопроса Преобразование проекта 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

Может кто-нибудь предложить, что я делаю неправильно?

Используйте Spring Boot для создания Fatjar, не делайте этого сами. Spring Boot уже генерирует исполняемый фатжар, содержащий все, вы пытаетесь втиснуть его в другой фатжар.

M. Deinum 22.05.2019 13:56

Вы имели в виду, что мой mmJar в корневом build.gradle неправильный путь? Не могли бы вы опубликовать это как ответ, используя два моих файла gradle?

nantitv 22.05.2019 14:00

Ваш проект Spring Boot (sub) IS Fatjar... Вам больше ничего не нужно.

M. Deinum 22.05.2019 14:01
1
3
940
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Как было предложено @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.DefaultDe‌​pendencyHandler.

nantitv 22.05.2019 14:28

См. 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' }

nantitv 22.05.2019 14:28

Я был глуп. Забыл добавить плагин «java» для второго проекта build.gradle

nantitv 22.05.2019 14:30

да, это решило проблему. Я проверил содержимое толстой банки ( jar tf myspringboot.jar ), и я вижу, что мой otherproject1.jar в этом

nantitv 22.05.2019 14:43

Другие вопросы по теме

Как использовать репозиторий данных spring для mongodb для извлечения данных из репозиториев mongo с динамическими именами полей?
Экспоненциальная отсрочка для бизнес-исключений при использовании реактивного spring-amqp?
Spring REST api OAuth2 проверяет токен с внешнего сервера авторизации
Spring Boot прочитал файл свойств из командной строки. Не удалось разрешить заполнитель «ConfigPath»
Как с помощью Spring Security перенаправить зарегистрированного пользователя на его главную страницу, а незарегистрированного пользователя на другую
Развернуть весеннее загрузочное приложение на tomcat, должен ли я заменить все URL-адреса моего приложения
Как убедиться, что аннотация @Scheduled присутствует в методе
Как использовать тип карты Cassandra в Java
Почему файл pom.xml выдает неизвестную ошибку
Как интегрировать фабричный метод, который принимает Class<T> и производит T в Spring

Похожие вопросы

Как я могу протестировать свой класс JwtAuthentication с помощью JUnit и Mockito?
Использование коллекторов для группировки по одному полю, подсчета и добавления другого значения поля
Как с помощью Spring Security перенаправить зарегистрированного пользователя на его главную страницу, а незарегистрированного пользователя на другую
Axon Как я могу добавить прослушиватель/перехватчик событий для перехвата событий до того, как они достигнут своих обработчиков?
Как решить ошибку HHH000346, используя hibernate 5 и mysql?
Ожидаемое значение выражения jsonPath, но возвращаемый список значений
Как выполнить модульное тестирование (вставить) уровень поставщика данных в Spring Framework?
Как опубликовать список bean-компонентов с помощью RestTemplate, но bean-компонент должен быть массивом байтов?
Почему мой работающий интерфейс зацикливает мою очередь Продолжить здесь
Как мы можем сделать асинхронный вызов API REST в Java?