如何通过jar设置主类可执行的vanilla groovy项目?

djh*_*987 4 java groovy jar

我变得非常沮丧.我无法在互联网上的任何地方找到我的问题的单一,有凝聚力的答案.很多文档,但没有任何东西可以将它们组合在一起(尽管我能找到).

我只需要有人告诉我:

  • 如何设置一个groovy项目(编辑:包括放置源文件的位置,在哪些目录,目录结构等)
  • 假设我以前没有构建groovy
  • 或java之前(我有,但与我合作)
  • 以某种方式我可以指定一个依赖项(这是我的依赖项 - > https://github.com/bpsm/edn-java)所以可能使用maven或gradle
  • 一个主要类和主要方法(再次,与我合作)
  • 在构建结束时,我需要一个我可以执行的jar文件,java -jar <groovy-project>.jar打印出"hello world"

尽可能简单.

Wil*_*ill 9

我强烈推荐Gradle; 设置非常简单(虽然我在学习它时也很挣扎).我在github中添加了生成的项目.

让我们在没有IDE的情况下从零创建项目结构.我认为你已经$JAVA_HOME设置好了.

1.创建项目结构

  1. 下载Gradle并将其放入您的$PATH

  2. 创建目录项目(我创建/tmp/gr8ex)

  3. 切换到它然后运行gradle init[1]

  4. 编辑build.gradle创建的文件并添加以下行:

    plugins { // [2]
        id 'groovy'
    }
    
    repositories { mavenCentral() } // [3]
    
    dependencies { // [4]
        testCompile 'org.codehaus.groovy:groovy-all:2.4.8'
        compile 'org.codehaus.groovy:groovy-all:2.4.8'
        testCompile 'junit:junit:4.12'
    }
    
    Run Code Online (Sandbox Code Playgroud)

现在是源文件; 我们需要创建gradle使用的默认目录结构(我们可以更改它,但让我们使用默认值):

  1. 这是创建源代码目录:

    mkdir -p src/main/groovy
    
    Run Code Online (Sandbox Code Playgroud)
  2. 和测试源文件夹:

    mkdir -p src/test/groovy
    
    Run Code Online (Sandbox Code Playgroud)
  3. 最终结果应如下所示:

    gr8ex
        ??? build.gradle
        ??? gradle
        ?   ??? wrapper
        ?       ??? gradle-wrapper.jar
        ?       ??? gradle-wrapper.properties
        ??? gradlew
        ??? gradlew.bat
        ??? settings.gradle
        ??? src
            ??? main
            ?   ??? groovy
            ??? test
                ??? groovy
    
    Run Code Online (Sandbox Code Playgroud)

2.添加源代码

  1. 让我们添加一个测试包:

    mkdir -p src/test/groovy/org/gr8ex
    
    Run Code Online (Sandbox Code Playgroud)
  2. 并且测试.我正在使用gedit src/test/groovy/org/gr8ex/HelloTest.groovy:

    package org.gr8ex
    
    class HelloTest extends GroovyTestCase {
        void 'test Hello should return "Hello, World!"' () {
            assert new Hello().world == "Hello, World!"
        }
    }
    
    Run Code Online (Sandbox Code Playgroud)
  3. 让我们执行测试并检查它是否失败:

    gradle test
    
    Run Code Online (Sandbox Code Playgroud)
  4. 是的,它失败了:

    /tmp/gr8ex/src/test/groovy/org/gr8ex/HelloTest.groovy: 5: unable to resolve class Hello 
     @ line 5, column 12.
              assert new Hello().world == "Hello, World!"
              ^
    
    1 error
    
    :compileTestGroovy FAILED
    
    Run Code Online (Sandbox Code Playgroud)
  5. 我们来添加源文件夹

    mkdir -p src/main/groovy/org/gr8ex
    
    Run Code Online (Sandbox Code Playgroud)
  6. 和一个源文件(我用过gedit src/main/groovy/org/gr8ex/Hello.groovy).注意它已经有我们的static main方法:

    package org.gr8ex
    
    class Hello {
        def getWorld() {
            "Hello, World!"
        }
    
        static main(args) {
            println new Hello().world
        }
    }
    
    Run Code Online (Sandbox Code Playgroud)
  7. 再次测试(带gradle test)并断言我们得到消息BUILD SUCCESSFUL:

    $ gradle test
    :compileJava UP-TO-DATE
    :compileGroovy
    :processResources UP-TO-DATE
    :classes
    :compileTestJava UP-TO-DATE
    :compileTestGroovy
    :processTestResources UP-TO-DATE
    :testClasses
    :test
    
    BUILD SUCCESSFUL
    
    Total time: 5.52 secs
    
    Run Code Online (Sandbox Code Playgroud)

完成.是时候创建应用程序jar了.

3.创建jar可执行文件

有几种方法可以实现这一点(如阴影插件).我会坚持使用"胖子"的方法.

  1. 让我们fatjarbuild.gradle[5]中添加一条指令:

    task fatjar(type: Jar) {
        manifest {
            attributes 'Main-Class': 'org.gr8ex.Hello'
        }
        from { 
            configurations
                .runtime
                .collect { it.isDirectory() ? it : zipTree(it) }
        }
        with jar
    }
    
    Run Code Online (Sandbox Code Playgroud)
  2. 包装它:

    gradle fatjar
    
    Run Code Online (Sandbox Code Playgroud)
  3. 结果jar将在builds/libs/gr8ex.jar.让我们执行它:

    $ java -jar build/libs/gr8ex.jar 
    Hello, World!
    
    Run Code Online (Sandbox Code Playgroud)
  4. 利润!您可以使用intellij和(我相信)eclipse导入此项目.


[1]:Gradle创建一些基本结构并添加包装脚本,以便在没有Gradle的情况下执行它(如果需要).

[2]:我们告诉gradle这个项目将使用groovy

[3]:我们告诉gradle使用mavencentral存储库.JCenter也很受欢迎.

[4]:这里我们告诉gradle这个项目需要在编译和测试阶段使用groovy-all lib

[5]:如果你只是坚持一个jar {}指令,就像这个答案一样,你将以一个非常薄的罐子结束,这将缺少groovy libs.这个"fatjar"将你的libs打包到jar中.根据您的使用情况,您可能需要稍微调整一下.