Явная проблема для теневого плагина с Gradle
Я использую Gradle v3.4 и теневой плагин v1.2.4. Я публикую jar-файл в моем локальном репозитории Maven, используя следующую информацию в моем файле build.gradle
mainClassName = 'some.thing.SomeClient'
jar {
manifest {
attributes(
'Class-Path': configurations.compile.collect { it.getName() }.join(' '),
// 'Main-Class': 'some.thing.SomeClient'
)
}
}
shadowJar {
baseName = 'commons-java'
classifier = null
version = '0.0.1-SNAPSHOT'
}
artifacts {
archives shadowJar
}
jar.dependsOn shadowJar
После публикации я пытаюсь использовать эту зависимость внутри другого проекта следующим образом, но при запуске gradle build получаю копию ошибки ниже.
/**
* jar/shadow jar (shadow jar extends jar task to create fat jar)
*/
jar {
manifest {
attributes(
'Class-Path': configurations.compile.collect { it.getName() }.join(' '),
//'Main-Class': 'some.thing.SomeClient'
)
}
}
shadowJar {
baseName = 'something-java-client'
classifier = null
version = '0.0.1-SNAPSHOT'
}
artifacts {
archives shadowJar
}
jar.dependsOn shadowJar
ошибка
The value of a manifest attribute must not be null (Key=Main-Class).
1 ответ
Решение
Проблема была вызвана атрибутом mainClassName в gradle.properties, приводящим к исключению. Удаление его из gradle.properties устранило проблему.
Также возможно, что mainClassName
устанавливается после применения плагина, что является известной проблемой. Быстрое и грязное решение состоит в том, чтобы установить свойство перед применением плагина, например так:
buildscript {
repositories {
jcenter()
}
dependencies {
classpath 'com.github.jengelman.gradle.plugins:shadow:2.0.2'
}
}
plugins {
id "application"
}
mainClassName = 'some.thing.SomeClient'
apply plugin: 'com.github.johnrengelman.shadow'
// ...