Работа с путями в Gradle, когда я заменяю сборку Ant - PullRequest
3 голосов
/ 06 января 2012

Я работаю над проверкой концепции использования Gradle для замены существующей сборки Ant - для приложений Java EE - которая началась просто, но со временем стала более сложной. (Сборка Ant является общей и управляется соответствующими свойствами и путями в двух файлах, которые импортируются в начале сборки. Это была хорошая идея, но сейчас она немного скрипит.)

У меня есть несколько частей, замененных Gradle прямо сейчас, и все шло хорошо, пока я не нашел нужного пути. Пути хороши в файлах Ant, поскольку они позволяют вам определять зависимости только один раз и ссылаться на них везде, где они нужны.

Моя поисковая система foo сегодня должна быть слабой, но у меня возникают проблемы с поиском где-либо, где объясняется, как определить в Gradle что-то, что будет действовать как путь, и что я могу обойти.

Если конкретнее, как мне заменить следующий путь и ссылку на этот путь в задаче Javac Ant чем-то, что Gradle будет использовать?

Сначала путь:

<path id="base.path">
    <pathelement location="ApacheCommons/commons-lang/commons-lang.jar" />
    <pathelement location="log4j/log4j.jar" />
    <pathelement location="Acme/acme.jar" />
    <fileset dir="." erroronmissingdir="false">
        <include name="**/*.jar"/>
    </fileset>
    <fileset dir="../../${project.name}Model" erroronmissingdir="false">
        <include name="**/${project.name}Model.jar"/>
    </fileset>
    <fileset dir="../../${project.name}Persistance" erroronmissingdir="false">
        <include name="**/${project.name}Persistance.jar"/>
    </fileset>      
    <fileset dir="../../${project.name}Service" erroronmissingdir="false">
        <include name="**/${project.name}Service.jar"/>
    </fileset>
    <path refid="server.path" />
</path>

Теперь я беру путь и помещаю его в переменную Groovy:

def basePath = ant.properties['base.path']

А затем используйте его в задании Javac:

ant.javac(srcDir: "${compileSourcecode}", destDir: "WebContent/WEB-INF/classes", source: "${compileSourceversion}", target: "${compileTargetversion}", verbose: "${compileVerbose}", debug: "${compileDebug}", deprecation: "${compileDeprecation}", optimize: "${compileOptimize}", classpathref: "${basePath}", includeAntRuntime: "${compileIncludeAntRuntime}")

За исключением того, что переменная basePath заканчивается на null, а затем ничего не компилируется.

1 Ответ

4 голосов
/ 09 января 2012

Поскольку вы переходите на Gradle, я бы порекомендовал настроить ваш classpath в самом Gradle. Предпочтительным способом управления зависимостями в Gradle (как вы, возможно, уже знаете) является использование репозитория зависимостей (Maven или Ivy), а затем определение его из вашего dependencies закрытия для каждого из ваших проектов gradle

dependencies{
  compile 'commons-lang:commons-lang:2.2'
  compile 'log4j:log4j:1.2.16'
  ...
}

Однако, если вам нужно обратиться к локальным файлам jar, у вас есть несколько других вариантов:

1) Настройте свой собственный репозиторий Maven или Ivy

На начальном этапе это довольно трудоемкая работа, но в долгосрочной перспективе она может оказаться более полезной.

2) Создать хранилище плоских файлов

Добавьте это к вашему build.gradle

repositories { 
  flatDir{
    dirs 'lib'
  } 
}

Поместите ваши jars / wars в папку lib в этом формате <name>-<version>.jar или просто <name>.jar:

e.g.
lib/acme-1.2.3.jar
lib/acme.jar

Тогда вы можете ссылаться на него, как обычно:

dependencies{
  ...
  compile 'acme:acme:1.2.3'
  ...
}

Примечание: Для поиска файла используются только имя и версия зависимости, и транзитивные зависимости не предполагаются.

3) Ссылка на файлы jar напрямую

Например:

dependencies{
  ...
  compile file("../../${project.name}Model/${project.name}Model.jar")
  compile fileTree(dir: '../../${project.name}Model', include: '**/*.jar')
  ...
}

Примечание: ${project.name} разрешит имя вашего проекта gradle .

Все файлы jar, добавленные в конфигурацию compile, будут автоматически доступны для задач компиляции по умолчанию, таких как classes и jar. Вы можете создать пользовательскую задачу Compile , чтобы заменить текущую ant.javac(...) задачу следующим образом:

task compileSomething(type: Compile){
  source = file("${compileSourcecode}")
  destinationDir = file("WebContent/WEB-INF/classes")
  sourceCompatibility = "${compileSourceversion}"
  targetCompatibility = "${compileTargetversion}"
  options.verbose = "${compileVerbose}".toBoolean()
  options.debug = "${compileDebug}".toBoolean()
  options.optimize = "${compileOptimize}".toBoolean()
  options.deprecation = "${compileDeprecation}".toBoolean()

  classpath = configurations.compile
  // or
  classpath = files('lib/library1.jar')
  // or any combination
  classpath = configuraions.compile + files('lib/library1.jar')
}

Примечание: Не думаю, что вы можете установить includeAntRuntime, но я думаю, что по умолчанию установлено true.

Конечно, вы можете сохранить список файлов в переменной для более детального повторного использования:

libs = files('lib/library1.jar', 'lib/library2.jar')

dependencies{
  compile libs
}

task compileSomething(type: Compile){
  classpath = libs
}

Надеюсь, это поможет.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...