Gradle: compile vs compileOnly

165
05 мая 2018, 17:30

build.gradle

apply plugin: 'java'
apply plugin: 'application'
dependencies {
    compile "log4j:log4j:1.2.17"
}

в итоге получу jar-ку, которая не будет содержать бинарники log4j. Тогда какая разница между compile и compileOnly, если в итоге получится одна и та же jar-ка?

Answer 1

Идеологически 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) }
    }
}
READ ALSO
Падает mysql сервер при запросе Alter Table

Падает mysql сервер при запросе Alter Table

Использую команду ALTER TABLEВроде всё просто

207
LOAD DATA IN FILE mysql проблема с кодировкой

LOAD DATA IN FILE mysql проблема с кодировкой

есть файл вот с таким содержимым

259
Сортировка товаров по цене из категорий

Сортировка товаров по цене из категорий

Проблема такаяИмеется список товаров

242
Workbench не подключается к базе

Workbench не подключается к базе

Поднял mysql в docker контейнере командой:

231