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

时间:2018-05-23 00:46:23

标签: java gradle

我是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目录中)。 / p>

$ 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'
}

谢谢你, 艾哈迈德'。

3 个答案:

答案 0 :(得分:0)

使用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'.

答案 1 :(得分:0)

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

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

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

答案 2 :(得分:0)

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

  • 执行gradle init --type java-application

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

  • 可运行的胖子罐(将所有相关库复制到该罐子中)

     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