29

使用 maven,我可以创建一个项目,使用它的依赖项设置我的 pom,使用 main 方法编写一个类,然后运行它:

mvn compile exec:java -Dexec.mainClass=thornydev.App

这样做的等价物是什么?

我可以gradle build,它为我构建了一个 jar 文件,但是如果主类对其他 jar 有任何依赖关系,那么在不设置类路径的情况下仅运行 jar 将无法工作。gradle java 插件可以运行应用程序并为我设置类路径吗?

我正在寻找一种用于简单一次性使用的命令行解决方案,而不是 IDE 集成(我知道该怎么做)。

4

3 回答 3

33

最简单的解决方案是使用Application Plugin,它提供了一个run任务。要从命令行配置主类,您必须设置mainClassName某个系统(或项目)属性的值,然后从命令行传递该属性:

apply plugin: "application"

mainClassName = System.getProperty("mainClass")

现在您可以使用gradle run -DmainClass=thornydev.App.

于 2013-05-03T03:19:28.847 回答
2

作为构建过程的一部分,我需要运行一个 Java 程序,而应用程序插件带来了太多的包袱。

我确实不喜欢应用程序插件,但最后我使用了“侵入性”小得多的JavaExec 插件

我有一个类文件MyObfuscator.classbuild.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 likegradle build -PPARAM1=HELLO来运行参数化构建。

于 2017-05-22T21:36:01.023 回答
0

如果我的插件是:

<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>

gradle 中的等效项是什么?

于 2021-02-21T01:46:29.757 回答