build.gradle
apply plugin: 'java'
apply plugin: 'application'
dependencies {
compile "log4j:log4j:1.2.17"
}
в итоге получу jar-ку, которая не будет содержать бинарники log4j. Тогда какая разница между compile и compileOnly, если в итоге получится одна и та же jar-ка?
Идеологически compile и compileOnly различаются тем, что compile зависимости следует распространять вместе с приложением, а compileOnly либо не нужны во время выполнения (например, библиотеки с аннотациями использующимися только во время компиляции), либо предоставляются средой выполнения (например, Java EE контейнер должен предоставляь свою реализацию JPA или Servlet).
В вашем конкретном случае вы просто не там ищете бинарники log4j, они будут в build/distributions/${project.name}.zip/${project.name}/lib. Плагин application пакует зависимости не в JAR, а в этот архив. При этом пакуются только compile зависимости, а compileOnly - нет.
Если вы хотите паковать зависимости в JAR, то вы можете этого добиться при помощи плагина FatJar или такой конфигурации таска jar:
jar {
manifest {
attributes "Main-Class": "root.package.of.my.Application"
}
from {
configurations.compile.collect { it.isDirectory() ? it : zipTree(it) }
}
}
Сборка персонального компьютера от Artline: умный выбор для современных пользователей