【问题标题】:Using gradle to build a very simple java program使用gradle构建一个非常简单的java程序
【发布时间】:2018-05-23 00:46:22
【问题描述】:

我是 Java 和 Gradle 的新手,并且有一个非常新手的问题。我有以下 Java 文件:

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

我能够使用 javac 编译上述文件,并使用命令“java TestMain”运行它。

我现在正在尝试使用 gradle 构建框架来做同样的事情。我执行了以下步骤: 运行“gradle init --type java-library 将上述文件复制到 src/main/java/

当我运行“./gradlew build”时,我得到一个 TestMain.class 文件,还有一个“building-java-file.jar”(整个 gradle 目录在 building-java-file 目录中)。

$ ls -l build/classes/main/TestMain.class 
-rw-r--r--  1 user1  foo\eng  610 May 22 17:22 build/classes/main/TestMain.class

$ java  build/classes/main/TestMain
Error: Could not find or load main class build.classes.main.TestMain

如何运行 TestMain.class? 另外,gradle创建jar文件-building-java-file.jar的原因是什么?

顺便说一句,我的 build.gradle 文件很空。

apply plugin: 'java'

repositories {
    jcenter()
}

dependencies {
    // The production code uses the SLF4J logging API at compile time
    compile 'org.slf4j:slf4j-api:1.7.21'

    testCompile 'junit:junit:4.12'
}

谢谢你, 艾哈迈德。'

【问题讨论】:

  • 关于更改 jar 的名称,您可以使用 jar.archiveName = “myjar.jar”
  • @piy26 我的问题更重要的是,为什么还要创建 jar 文件。这是隐式完成的还是因为我做了一个“gradle init --type java-library”
  • @NaveenKumar 澄清一下,我必须使用 gradle 来执行包含“main”的 java 文件。我不能使用java独立执行它吗?如果是这样,为什么不呢?逻辑是什么?
  • 每个 Gradle java 项目在运行 build 任务时都会创建一个 jar。 classes 任务只生成类文件。 Java 插件上的 Gradle 用户指南页面有一些很好的视觉效果和相关信息。你也可以使用application 插件。

标签: java gradle


【解决方案1】:

我的问题的答案在 Gradele 文档站点中有清楚的解释。

基本上,从: gradle init --type java-application

链接: https://guides.gradle.org/building-java-applications/?_ga=2.79084180.165016772.1527029076-64181247.1527029076

【讨论】:

    【解决方案2】:

    使用 JavaExec。例如,将以下内容放入 build.gradle

    task execute(type:JavaExec) {
       main = mainClass
       classpath = sourceSets.main.runtimeClasspath
    }
    

    运行 gradle -PmainClass=Boo 执行。你得到

    $ gradle -PmainClass=Boo execute
    :compileJava
    :compileGroovy UP-TO-DATE
    :processResources UP-TO-DATE
    :classes
    :execute
    I am BOOMMMM!
    

    mainClass 是在命令行中动态传入的属性。类路径设置为获取最新的类。

    如果不传入 mainClass 属性,则按预期失败。

    $ gradle execute
    
    FAILURE: Build failed with an exception.
    
    * Where:
    Build file 'xxxx/build.gradle' line: 4
    
    * What went wrong:
    A problem occurred evaluating root project 'Foo'.
    > Could not find property 'mainClass' on task ':execute'.
    

    【讨论】:

    • 您似乎是 StackOverflow 的新手,可能是无意的。我建议删除你的帖子。
    【解决方案3】:

    我认为您正在寻找创建可运行 jar 的解决方案。这是您可以在 build.gradle 中添加的解决方案

    • 执行gradle init --type java-application

    • 将以下 gradle 任务添加到 build.gradle。

    • 可运行的胖 Jar(所有依赖库都复制到 jar 中)

       task fatJar(type: Jar) {
      
            manifest {
                attributes 'Main-Class': 'com.example.gradle.App'
            }
            from {
                configurations.compile.collect { it.isDirectory() ? it : zipTree(it) }
            } with jar
      
          }
      

    将所有依赖项复制到目录并将类路径添加到清单中的可运行 jar

    def dependsDir = "${buildDir}/libs/dependencies/"
    task copyDependencies(type: Copy) {
        from configurations.compile
        into "${dependsDir}"
    }
    task createJar(dependsOn: copyDependencies, type: Jar) {
      
        manifest {
            attributes('Main-Class': 'com.example.gradle.App',
                    'Class-Path': configurations.compile.collect { 'dependencies/' + it.getName() }.join(' ')
            )
        }
        with jar
    }
    

    如何使用?

    将上述任务添加到 build.gradle
    执行gradle fatJar //创建fatJar
    执行 gradle createJar // 创建 jar 并复制依赖项。

    我写的关于这个主题的完整文章可以在这里阅读:A simple java project with Gradle

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2018-12-28
      • 2016-03-26
      • 2017-09-03
      • 2012-08-16
      • 2022-06-23
      • 2011-09-12
      • 1970-01-01
      相关资源
      最近更新 更多