繁体   English   中英

使用gradle构建一个非常简单的java程序

[英]Using gradle to build a very simple java program

我是 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'
}

谢谢你,艾哈迈德。

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

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

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

使用 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 是在命令行动态传入的属性。 classpath 设置为拾取最新的类。

如果您没有传入 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'.

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

  • 执行gradle init --type java-application

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

  • Runnable fat 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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM