Что является эквивалентом 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>

что будет эквивалентным в градиенте?

Другие вопросы по тегам