我目前正在将应用程序从Maven迁移到Gradle(4.10.2)。 在maven中,将生成一个tar.gz文件,其中包含配置,依赖项和一些空目录,应用程序随后将在运行时使用这些空目录。
在gradle中,我正在使用发行插件通过distTar-Task创建tar.gz。
要在tar.gz中创建空目录,请在构建目录中创建它们,然后由distTar将它们复制到tar.gz中。
我最终通过创建一个任务createEmptyDirectories
来解决这个问题,该任务将只创建目录并完成该工作。
distTar将依赖于此任务,以便在我认为tar.gz之前创建目录。
在构建过程中(使用createEmptyDirectories
总是跳过任务gradle clean build
:
:createEmptyDirectories (Thread[Daemon worker Thread 7,5,main]) started.
> Task :createEmptyDirectories
Skipping task ':createEmptyDirectories' as it has no actions.
:createEmptyDirectories (Thread[Daemon worker Thread 7,5,main]) completed. Took 0.0 secs.
当我使用gradle createEmptyDirectories
自己运行任务时,任务将正确执行:
> Configure project :
build/mailmanager/var/rtc/command_control created[true]
build/mailmanager/var/rtc/resources created[true]
build/mailmanager/var/log created[true]
我在做什么错?有没有更好的方法将这些空目录放入tar中?
这是我的build.gradle:
buildscript {
dependencies {
classpath 'org.asciidoctor:asciidoctor-gradle-plugin:1.5.8'
classpath 'org.asciidoctor:asciidoctorj-pdf:1.5.0-alpha.15'
}
}
plugins {
id 'org.asciidoctor.convert' version '1.5.3'
id 'java'
id 'distribution'
}
group = 'de.printcom'
version = '4.4.0'
description = 'MailManager'
sourceCompatibility = 1.8
targetCompatibility = 1.8
//mainClassName = 'de.printcom.mailmanager.StartManagerWithoutUi'
tasks.withType(JavaCompile) {
options.encoding = 'UTF-8'
}
task('createEmptyDirectories') {
dependsOn jar
boolean created = new File(project.buildDir.name + "/mailmanager/var/rtc/command_control").mkdirs()
System.println(project.buildDir.name + "/mailmanager/var/rtc/command_control created[" + created + "]")
created = new File(project.buildDir.name + "/mailmanager/var/rtc/resources").mkdirs()
System.println(project.buildDir.name + "/mailmanager/var/rtc/resources created[" + created + "]")
created = new File(project.buildDir.name + "/mailmanager/var/log").mkdirs()
System.println(project.buildDir.name + "/mailmanager/var/log created[" + created + "]")
}
distTar {
dependsOn check, createEmptyDirectories
compression = Compression.GZIP
extension = 'tar.gz'
}
distributions {
main {
contents {
into("mailmanager/lib") {
from jar
from configurations.runtime
fileMode = 744
}
from("src/main/scripts/release_preprocessing/Release_4_3_0/Preprocessing") {
into("mailmanager/sql")
fileMode = 750
}
from("src/main/scripts/release_preprocessing/Release_4_3_0/Rollback") {
into("mailmanager/sql")
}
from("src/main/scripts/") {
include("startup.sh")
into("mailmanager/bin")
}
from("src/main/scripts/commands") {
include("*.mmc")
into("mailmanager/commands")
fileMode = 640
}
from("src/main/scripts/configuration") {
include("*.mmc")
into("mailmanager/commands")
fileMode = 640
}
from("src/main/resources/properties/deploy") {
include("default.properties", "live.properties", "test.properties", "wallet_example.properties")
into("mailmanager/conf")
rename("default.properties", "default.properties.template")
rename("live.properties", "live.properties.template")
rename("test.properties", "test.properties.template")
rename("wallet_example.properties", "wallet_example.properties.template")
fileMode = 640
}
from("src/main/resources") {
include("quartz.properties", "ehcache.xml")
into("mailmanager/conf")
fileMode = 640
}
from(project.buildDir.name + "/classes") {
include("log4j-updated.xml")
into("mailmanager/conf")
rename("log4j-updated.xml", "log4j.xml")
fileMode = 644
}
from(project.buildDir.name + "/resources/main/version.html") {
include("version.html")
into("mailmanager")
fileMode = 644
}
from("README.txt") {
into("mailmanager")
fileMode = 644
}
from("KnownBugs.txt") {
into("mailmanager")
fileMode = 644
}
from("ReleaseNotes.txt") {
into("mailmanager")
fileMode = 644
}
into("mailmanager/docs") {
from asciidoctor
include("Handbuch.pdf")
fileMode = 644
}
into ("var") {
from createEmptyDirectories
include("rtc/command_control")
include("rtc/resources")
include("log")
fileMode = 644
includeEmptyDirs=true
}
// from(project.buildDir.name + "/mailmanager/var") {
// include("rtc/command_control")
// include("rtc/resources")
// include("log")
// into("var")
// fileMode = 644
// includeEmptyDirs=true
// }
}
}
}
asciidoctorj {
version = '1.5.5'
}
asciidoctor {
backends 'pdf'
attributes 'build-gradle': file('build.gradle'),
'sourcedir': 'src/docs/asciidoc',
'source-highlighter': 'coderay',
'imagesdir': 'images',
'toc': 'left',
'icons': 'font',
'setanchors': '',
'idprefix': '',
'idseparator': '-',
'docinfo1': '',
'revnumber': project.version,
'revdate': getDate()
}
def getDate() {
new Date().format('d.MM.yyyy')
}
test {
testLogging {
events "started", "passed", "skipped", "failed", "standardOut", "standardError"
}
}
dependencies {
compile group: 'commons-lang', name: 'commons-lang', version: '2.6'
compile group: 'commons-io', name: 'commons-io', version: '2.4'
compile group: 'commons-codec', name: 'commons-codec', version: '1.10'
compile group: 'org.apache.ant', name: 'ant', version: '1.9.6'
compile group: 'org.antlr', name: 'antlr', version: '3.5.2'
compile group: 'javax.el', name: 'javax.el-api', version: '2.2.4'
compile group: 'org.glassfish.web', name: 'javax.el', version: '2.2.4'
compile group: 'org.apache.commons', name: 'commons-email', version: '1.5'
compile group: 'org.apache.commons', name: 'commons-compress', version: '1.17'
compile group: 'org.projectlombok', name: 'lombok', version: '1.18.2'
compile group: 'com.google.guava', name: 'guava', version: '18.0'
compile group: 'javax.annotation', name: 'jsr250-api', version: '1.0'
compile group: 'org.eclipse.persistence', name: 'javax.persistence', version: '2.1.0'
compile group: 'org.springframework', name: 'spring-core', version: '4.1.7.RELEASE'
compile group: 'org.springframework', name: 'spring-beans', version: '4.1.7.RELEASE'
compile group: 'org.springframework', name: 'spring-orm', version: '4.1.7.RELEASE'
compile group: 'org.springframework', name: 'spring-jdbc', version: '4.1.7.RELEASE'
compile group: 'org.springframework', name: 'spring-tx', version: '4.1.7.RELEASE'
compile(group: 'org.springframework', name: 'spring-context', version: '4.1.7.RELEASE') {
exclude(module: 'commons-logging')
}
compile group: 'org.springframework', name: 'spring-context-support', version: '4.1.7.RELEASE'
compile group: 'org.hibernate', name: 'hibernate-core', version: '4.3.10.Final'
compile group: 'org.hibernate', name: 'hibernate-entitymanager', version: '4.3.10.Final'
compile group: 'org.hibernate', name: 'hibernate-c3p0', version: '4.3.10.Final'
compile group: 'org.hibernate', name: 'hibernate-ehcache', version: '4.3.10.Final'
compile group: 'org.hibernate.common', name: 'hibernate-commons-annotations', version: '4.0.5.Final'
compile group: 'org.hibernate.javax.persistence', name: 'hibernate-jpa-2.1-api', version: '1.0.0.Final'
compile group: 'org.hibernate', name: 'hibernate-validator', version: '4.3.2.Final'
compile group: 'javax.validation', name: 'validation-api', version: '1.1.0.Final'
compile group: 'net.sf.ehcache', name: 'ehcache-core', version: '2.6.11'
compile group: 'com.mchange', name: 'c3p0', version: '0.9.5.1'
compile group: 'com.sun.mail', name: 'javax.mail', version: '1.6.0'
compile group: 'dom4j', name: 'dom4j', version: '1.6.1'
compile group: 'org.slf4j', name: 'slf4j-api', version: '1.7.12'
compile group: 'commons-logging', name: 'commons-logging', version: '1.2'
compile(group: 'org.quartz-scheduler', name: 'quartz', version: '2.2.1') {
exclude(module: 'c3p0')
}
compile group: 'org.quartz-scheduler', name: 'quartz-jobs', version: '2.2.1'
compile group: 'com.cronutils', name: 'cron-utils', version: '5.0.5'
compile group: 'mysql', name: 'mysql-connector-java', version: '5.1.36'
compile group: 'hsqldb', name: 'hsqldb', version: '1.8.0.10'
compile group: 'com.oracle', name: 'ojdbc7', version: '12.1.0.2'
compile group: 'com.oracle', name: 'oraclepki', version: '12.1.0.2'
compile group: 'com.oracle', name: 'osdt_cert', version: '12.1.0.2'
compile group: 'com.oracle', name: 'osdt_core', version: '12.1.0.2'
compile group: 'org.slf4j', name: 'slf4j-log4j12', version: '1.7.12'
compile group: 'log4j', name: 'log4j', version: '1.2.17'
testCompile group: 'com.h2database', name: 'h2', version: '1.4.193'
testCompile group: 'org.junit.vintage', name: 'junit-vintage-engine', version: '4.12.2'
testCompile group: 'org.junit.jupiter', name: 'junit-jupiter-api', version: '5.0.0'
testCompile group: 'org.junit.jupiter', name: 'junit-jupiter-params', version: '5.0.0'
testCompile group: 'org.junit.jupiter', name: 'junit-jupiter-engine', version: '5.0.0'
testCompile group: 'org.junit.platform', name: 'junit-platform-launcher', version: '1.0.2'
testCompile group: 'org.mockito', name: 'mockito-core', version: '2.19.1'
testCompile group: 'com.github.stefanbirkner', name: 'system-rules', version: '1.16.0'
testCompile group: 'net.jodah', name: 'concurrentunit', version: '0.4.2'
testCompile group: 'org.springframework', name: 'spring-test', version: '4.1.7.RELEASE'
testCompile group: 'org.assertj', name: 'assertj-core', version: '3.2.0'
testCompile(group: 'org.dbunit', name: 'dbunit', version: '2.5.1') {
exclude(module: 'junit')
}
testCompile group: 'com.github.springtestdbunit', name: 'spring-test-dbunit', version: '1.2.1'
testCompile group: 'pl.pragmatists', name: 'JUnitParams', version: '1.0.5'
testCompile group: 'com.tngtech.archunit', name: 'archunit', version: '0.8.0'
}
答案 0 :(得分:1)
第一件事:您应该在doLast { ... }
闭包中包装要执行任务的自定义内容。
task createDirectories {
doLast {
// do stuff
}
}
第二,要创建目录,您应该使用mkdir
方法:https://docs.gradle.org/current/userguide/working_with_files.html#sec:creating_directories_example,该方法将默认在主项目目录下创建目录。
所以您的任务应该变成:
task createEmptyDirectories {
dependsOn jar
doLast {
mkdir "mailmanager/var/rtc/command_control"
mkdir "mailmanager/var/rtc/resources"
mkdir "mailmanager/var/log"
}
}
这是一个可以满足您的需要的工作示例:
目录结构(非常基础)
gradle-test
src/main/java/Main.java
build.gradle
settings.gradle
Main.java
public class Main {
public static void main(String[] args) {
System.out.println("Hello world");
}
}
settings.gradle
rootProject.name = 'gradle-test'
build.gradle
apply plugin: 'java'
apply plugin: 'distribution'
task createEmptyDirectories {
doLast {
mkdir 'var/test'
}
}
distTar.dependsOn createEmptyDirectories
distributions {
main {
contents {
into('lib') {
from jar
}
into('var') {
from 'var'
}
}
}
}
运行gradle distTar
后,将产生build/distributions/gradle-test.tar
。
gradle-test> tar tvf build/distributions/gradle-test.tar
drwxr-xr-x 0 0 0 0 1 Nov 00:51 gradle-test/
drwxr-xr-x 0 0 0 0 1 Nov 00:51 gradle-test/lib/
-rw-r--r-- 0 0 0 684 1 Nov 00:44 gradle-test/lib/gradle-test.jar
drwxr-xr-x 0 0 0 0 1 Nov 00:51 gradle-test/var/
drwxr-xr-x 0 0 0 0 1 Nov 00:45 gradle-test/var/test/
如您所见,jar文件位于lib文件夹中,/var/
具有所需的目录结构。希望这一点可以弄清楚。现在可能对您不起作用,因为您使用的是from createEmptyDirectories
,但是它占用了createEmptyDirectories任务的 output 为空(mkdir不会将创建的目录添加到任务输出的位置)使用,所以您必须明确)