【问题标题】:How do I run a main method in a Java Gradle project from command line?如何从命令行运行 Java Gradle 项目中的 main 方法?
【发布时间】:2019-12-04 20:29:05
【问题描述】:

我有一个 Gradle 项目(例如,MyProject),它有一个我只想用来运行小型 Java 应用程序的 main 方法。比如说,脚本在一个类和包中,如下所示:

MyScript.Java

package com.car.ant;

import com.3rdparty.library.LibraryException;

public class MyScript {
    public static void main(String[] args) {
        System.out.println("Hello world!");
    }
}

我用$ ./gradlew clean build 构建项目,没问题。我正在尝试通过命令行运行它,但是当我这样做时,尝试运行时出现异常:

$ pwd
~/workspace/MyProject/build/classes/java/main
$ java com.car.ant.MyScript
Exception in thread "main" java.lang.NoClassDefFoundError: com/3rdparty/library/exception/LibraryException
        at java.lang.Class.getDeclaredMethods0(Native Method)
        at java.lang.Class.privateGetDeclaredMethods(Class.java:2701)
        at java.lang.Class.privateGetMethodRecursive(Class.java:3048)
        ... 7 more

这个脚本不是应用程序的主要部分,但我只是希望它在其中每隔一段时间运行一次,我想弄清楚如何通过命令行自行运行它。有没有办法在不导入库的情况下做到这一点?我见过用一个罐子做的,但我想我可以不用一个罐子。

更新:

在阅读this 后尝试添加类路径,但现在我得到了一个不同的错误:

$ java -cp com/3rdparty/library/exception/LibraryException com.car.ant.MyScript
Error: Could not find or load main class com.car.ant.MyScript

【问题讨论】:

  • 如果你使用 gradle 我会推荐application 插件,你所要做的就是指定完全限定的主类名。它还处理您的所有库,因此您不必指定类路径。
  • 您对script 一词的使用相当令人困惑,因为您尝试运行的程序似乎是Java 程序。这些通常不称为脚本。脚本通常是指用“脚本”语言编写的程序,例如 shell、groovy 或 python。

标签: java exception gradle command-line main-method


【解决方案1】:

您可以在the Gradle Docs 阅读有关如何执行此操作的信息。

apply plugin: 'application'
mainClassName = "com.mycompany.myapplication.MyScript"
applicationDefaultJvmArgs = [
    "-Djava.util.logging.config.file=src/main/resources/logging.properties"
]

然后只需使用gradlew run 运行您的应用程序。

作为一个额外的好处,这个插件可以帮助您打包您的应用程序以进行分发。为此使用gradle distZip 命令。

【讨论】:

  • 我的代码并不是它所在的应用程序的真正焦点。该应用程序作为一个整体是在 Vert.x 上运行的服务。我在上面引用的代码需要时不时地根据需要(可能是手动)运行以对数据进行一些清理。它与网络应用程序相关,但不是它的核心。对于 Web 应用程序,我们使用 gradlew clean build 构建它。您上面的解决方案会对此有任何影响吗?如果我在 main 方法中添加另一段代码怎么办?这将如何影响所有这一切?
  • 当然,在将此解决方案应用于商业项目之前,您应该阅读我链接的文档。如果您无权自己进行更改,我建议您将其提交给您的构建大师。我的直觉是添加application 插件不应该是cleanbuild 任务的行为,但不要相信我的话。
  • 顺便说一句,如果您在构建项目时总是做“干净”,那是一种反模式。通常它是由以前的 Maven 用户完成的,他们遭受了该工具对陈旧输出文件的不良处理,这通常会导致损坏的工件。 Gradle 在这方面要好得多,并保证它总是会产生正确的工件(除非你以某种奇异的方式错误地配置它)。从clean build 中删除clean,gradle 将以完全安全的方式重用已构建的输出,从而为您节省大量时间。
【解决方案2】:

试试这个。

    plugins {
    id 'java-library'
    id 'application'
}
sourceCompatibility = JavaVersion.VERSION_1_8
targetCompatibility = JavaVersion.VERSION_1_8
/*
sourceCompatibility is "Java version compatibility to use when compiling Java source." 
targetCompatibility is "Java version to generate classes for."
*/
repositories {
    jcenter()
}
dependencies {
}


//To run the class name from command line using gradle run
mainClassName = 'com.sam.home.HelloWorld'

//To create a runnable jar  in GradleJavaProject\build\libs then java -jar GradleJavaProject.jar
jar {
    manifest {
        attributes 'Main-Class': 'com.sam.home.HelloWorld'
    }
}
//Beyond this line evertyhing is optional
//Alternatively you can run it as a task too gradle -q  runWithJavaExec
task runWithJavaExec(type: JavaExec) {
    group = "Execution"
    description = "Run the main class with JavaExecTask"
    classpath = sourceSets.main.runtimeClasspath
    main = 'com.sam.home.HelloWorld'
}
wrapper {
gradleVersion = '5.5'
distributionType = Wrapper.DistributionType.BIN
}

在命令行中输入 gradle run 或 gradle -q runWithJavaExec

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-03-11
    • 2016-09-03
    相关资源
    最近更新 更多