Gradle: развернуть JAR с пользовательской структурой: включить только каталог его содержимое

#java #gradle #intellij-idea #groovy

#java #gradle #intellij-идея #заводной

Вопрос:

Дополнение к вопросу:

Забыл упомянуть (потому что я изначально не считал это уместным), что srcDir имя должно быть создано в архиве как вложенная папка для всего остального.

Итак, структура в завершенном архиве выглядит следующим образом:

 srcDirName
  aaa.class
  bbb.class
  ccc.class
  propDirName
    properties.txt
 

Следующий код является решением для создания структуры, но не отвечает на мой первоначальный вопрос, потому что это зависит от того, exclude чтобы предотвратить включение нежелательных файлов propBaseDir . Я до сих пор не мог найти решение, используя just into without exclude .

Спасибо Майклу Истеру за совет по использованию into

 def srcDir = "build/classes/java/main/examples"
def srcDirName = "examples"
def propBaseDir = "src/main/java/examples"
def propDirName = "nls"

task deployAsJar(type: Jar) {
    from {
        files(srcDir) {
            include "**/*" into srcDirName
        }
    }
    from {
        files(propBaseDir) {
            exclude "*.java"
            include "$propDirName/*"
        }
    }
    archiveFileName = "examples.jar"
    destinationDirectory = file("~")
}
 

Оригинальный вопрос

У меня есть эта задача Gradle, которая в основном делает то, что я хочу:

  • все файлы в srcDir копируются, но не srcDir сам
  • все файлы в propDir копируются, включая propDir самого себя

За исключением того, что все файлы в propBaseDir (включая каталог в propDir ) также копируются, чего я не хочу.

Я знаю, что могу использовать exclude для исключения файлов, но есть ли способ скопировать ТОЛЬКО propDir и его файлы в архив?

 task deployAsJar(type: Jar) {
    from {
        files(srcDir) {
            include "**/*"
        }
    }
    from {
        files(propBaseDir) {
            include "$propDir/**"
        }
    }
    archiveFileName = "examples.jar"
    destinationDirectory = file("~")
}
 

Ответ №1:

Рабочий пример здесь.

(Редактировать: обновлено, чтобы отразить новую информацию в комментарии / OP. Обратите внимание, что я не уверен в более широкой цели, поэтому может быть более элегантное решение, чем использование deployAsJar задачи.)

Рассмотрим:

 project.ext.srcDirName = 'src'
project.ext.propDirName = 'props'

project.ext.srcDir = "${projectDir}/${srcDirName}"
project.ext.propBaseDir = "${projectDir}/base"
project.ext.propDir = "${propBaseDir}/${propDirName}"

task deployAsJar(type: Jar) {
    from (srcDir) {
        include "**/*" into srcDirName
    }
    from (propDir) {
        include "**/*" into "${srcDirName}/${propDirName}"
    }

    archiveFileName = "examples.jar"
    destinationDirectory = file(".")
}
 

Хитрость здесь заключается в использовании into with from для определения места назначения внутри архива, куда должны быть помещены файлы.

В моем примере репозитория это дает:

 $ jar tf examples.jar 
src/net/codetojoy/util/Util.java
src/net/codetojoy/Employee.java
src/props/abc/abc.properties
src/props/def/def.properties
 

Комментарии:

1. Спасибо за совет по использованию «into». Я забыл упомянуть, что srcDirName содержит все файлы в архиве, включая propDirName и файлы, которые он содержит. Я не могу найти решение, используя «into» для создания этой структуры.

2. @bigswifty я обновил ответ и репозиторий новой информацией. Обратите внимание, что могло бы быть что-то более элегантное, если бы вы объяснили общую цель. Например, использование .class файлов предполагает, что цель включает компиляцию, поэтому может быть способ сделать это с помощью настройки существующей задачи. (Тем не менее, я не могу больше тратить на это время.)

3. Это сделало это. Еще раз спасибо.