Что является эквивалентом exec плагина maven для запуска приложений Java?
С помощью maven я могу создать проект, настроить pom с его зависимостями, написать класс с методом main, а затем запустить его:
mvn compile exec:java -Dexec.mainClass=thornydev.App
Что такое эквивалент для этого?
я могу сделать gradle build
, который создает файл JAR для меня, но если у основного класса есть какие-либо зависимости от других JAR, просто запуск JAR не будет работать без установки classpath. Может ли плагин gradle java запустить приложение и настроить для меня classpath?
Я ищу решение командной строки для простого одноразового использования, а не интеграции IDE (я знаю, как это сделать).
3 ответа
Самое простое решение - использовать плагин приложения, который, помимо прочего, обеспечивает run
задача. Чтобы сделать основной класс настраиваемым из командной строки, вам нужно установить mainClassName
к значению некоторого системного (или проектного) свойства, а затем передайте это свойство из командной строки:
apply plugin: "application"
mainClassName = System.getProperty("mainClass")
Теперь вы можете запустить приложение с gradle run -DmainClass=thornydev.App
,
Мне нужно было запустить Java-программу как часть процесса сборки, и плагин приложения был слишком загружен.
Я поиграл с плагином приложения, но в итоге я использовал гораздо менее "инвазивный" плагин JavaExec.
У меня есть файл класса MyObfuscator.class
в build.outputDirectory
и прежде чем я имел pom.xml
вот так, который запустил обфускацию кода в каталоге сборки с двумя параметрами:
<project>
...
<build>
...
<plugins>
...
<plugin>
<groupId>org.codehaus.mojo</groupId>
<artifactId>exec-maven-plugin</artifactId>
<version>1.2.1</version>
<executions>
<execution>
<id>obfuscate</id>
<phase>package</phase>
<goals>
<goal>exec</goal>
</goals>
<configuration>
<executable>java</executable>
<workingDirectory>${project.build.outputDirectory}</workingDirectory>
<arguments>
<argument>-Djava.library.path=.</argument>
<argument>-classpath</argument>
<argument>${project.build.outputDirectory}:lib.jar</argument>
<argument>MyObfuscator</argument>
<argument>HELLO</argument>
<argument>GOODBYE</argument>
</arguments>
</configuration>
</execution>
</executions>
</plugin>
...
</plugins>
</build>
...
</project>
Я свел это к Gradle:
apply plugin: "java"
// ...
task obfuscate(type: JavaExec) {
// Make sure it runs after compilation and resources.
// Skip this if that's not a requirement.
dependsOn classes
// run in the buildDir (this requirement was what
// made a simple "doLast" infeasible)
workingDir = file(buildDir)
classpath = files([
"${buildDir}/classes",
"${buildDir}/resources/main/lib.jar"
])
main = "MyObfuscator"
}
Если вам нужно параметризованное выполнение, как в примере Maven выше, добавьте в задачу несколько строк:
task obfuscate(type: JavaExec) {
// ... (as above)
// Set PARAM1 to a default value when it's not
// defined on the command line
if(!project.hasProperty("PARAM1")) {
ext.PARAM1 = "HELLO"
}
// PARAM1 is dynamic and PARAM2 is static, always "GOODBYE"
args = [PARAM1, "GOODBYE"]
}
Тогда зависит assemble
задание на obfuscate
(поместите эту строку где-нибудь ниже obfuscate
определение задачи):
assemble.dependsOn obfuscate
Или пусть (раньше) jar
Задача зависит от этого. Посмотрите на график внизу этого раздела документации, чтобы получить больше идей о том, где это сделать.
Затем вы можете позвонить Gradle как gradle build -PPARAM1=HELLO
запустить параметризованную сборку.
Если мой плагин:
<plugin>
<groupId>org.codehaus.mojo</groupId>
<artifactId>exec-maven-plugin</artifactId>
<executions>
<execution>
<id>run-benchmarks</id>
<phase>integration-test</phase>
<goals>
<goal>exec</goal>
</goals>
<configuration>
<classpathScope>test</classpathScope>
<executable>java</executable>
<arguments>
<argument>-classpath</argument>
<classpath />
<argument>org.openjdk.jmh.Main</argument>
<argument>.*</argument>
</arguments>
</configuration>
</execution>
</executions>
</plugin>
<plugin>
что будет эквивалентным в градиенте?