Проблема весенней загрузки между jar и задачей, которая создает jar: Gradle

#spring-boot #gradle #spring-boot-gradle-plugin

#весенняя загрузка #gradle #spring-boot-gradle-plugin

Вопрос:

Прямо сейчас у меня возникла эта проблема, когда мне нужно, чтобы мое приложение SpringBoot было превращено в исполняемый файл jar, но это должно быть сделано в задаче, а не просто в конфигурации в gradle.build.

Итак, приведенный ниже фрагмент в моем build.gradle создаст исполняемый файл jar:

 jar {
    manifest {
        attributes 'Main-Class': 'com.path.name.to.main.App'
    }
    from { configurations.compile.collect { it.isDirectory() ? it : zipTree(it) } }
}
  

Все работает, но когда я создаю jar в качестве задачи, jar больше не становится исполняемым и выдает эту ошибку Ошибка: не удалось найти или загрузить основной класс com.path.name.to.main.App
:

 task makeJar(type: Jar) {
    archiveName = 'app.jar'
    manifest {
        attributes 'Main-Class': 'com.path.name.to.main.App'
    }
    from { configurations.compile.collect { it.isDirectory() ? it : zipTree(it) } }
}
  

То, как моя компания выполняет развертывания, желательно создавать jar в задаче в build.gradle , в отличие от конфигурации, упомянутой выше.

Однако я не совсем уверен, почему перенос его из jar конфигурации в задачу повлияет на результат фактического jar, который был создан, и что мне нужно сделать, чтобы исправить это?

Ответ №1:

Прежде всего, jar конфигурация, о которой вы говорите, на самом деле является task of type Jar , она просто создается Gradle (скорее всего, его плагином Java). Ознакомьтесь с документацией по задачам, созданным плагинами, которые применяются к вашему сценарию сборки.

В качестве примера вы можете получить доступ к своей задаче makeJar тем же способом, что и к задаче jar после ее создания:

 task makeJar(type: Jar)

makeJar {
   // configuration things
}
  

То, как моя компания выполняет развертывания, желательно создавать jar в задаче в build.gradle , в отличие от конфигурации, упомянутой выше.

Знание того, что jar это тоже задача, показывает, что эта политика развертывания вашей компании вообще не имеет смысла. Вы можете настроить и использовать задачу jar так же, как задачу, созданную вручную.

Однако иногда имеет смысл создать файл JAR, содержащий только классы проекта и исполняемый файл JAR. Поскольку jar задача уже создает первую, нам нужна другая задача для создания второй. Исполняемые JAR-файлы также называются fat или uber JAR, и на самом деле есть действительно хороший плагин для их создания.

Корень вашей реальной проблемы заключается в том, что задача jar , поскольку она создается плагином Java, имеет некоторую конфигурацию, применяемую к ней автоматически, что ваша задача makeJar отсутствует. С помощью строки from { configurations.compile.collect { it.isDirectory() ? it : zipTree(it) } } все зависимости вашего проекта внутри compile конфигурации добавляются в JAR, но код в вашем собственном проекте отсутствует. Следующий код добавляет содержимое обычной jar задачи:

 task makeJar(type: Jar) {
    archiveName = 'app.jar'
    manifest {
        attributes 'Main-Class': 'com.path.name.to.main.App'
    }
    with jar
    from { configurations.compile.collect { it.isDirectory() ? it : zipTree(it) } }
}