首页 文章

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

提问于
浏览
4

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

我只需要有人告诉我:

  • 如何设置一个groovy项目(编辑:包括放置源文件的位置,在哪些目录,目录结构等)

  • 假设我之前没有构建groovy

  • 或java之前(我有,但与我合作)

  • 以某种方式我可以指定一个依赖项(这是我的依赖项 - > https://github.com/bpsm/edn-java)所以可能使用maven或gradle

  • 一个有主类和主方法的人(再次,和我一起工作)

  • 在构建结束时,我需要一个jar文件,我可以通过 java -jar <groovy-project>.jar 执行打印出"hello world"

尽可能简单 .

2 回答

  • 0

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

    让我们在没有IDE的情况下从零创建项目结构 . 我猜你已经$JAVA_HOME set up了 .

    1.创建项目结构

    • Download Gradle并将其放入 $PATH

    • 创建目录项目(我创建了 /tmp/gr8ex

    • 切换到它并运行 gradle init [1]

    • 编辑 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'
    }
    

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

    • 这是创建源代码目录:
    mkdir -p src/main/groovy
    
    • 和测试源文件夹:
    mkdir -p src/test/groovy
    
    • 最终结果应如下所示:
    gr8ex
        ├── build.gradle
        ├── gradle
        │   └── wrapper
        │       ├── gradle-wrapper.jar
        │       └── gradle-wrapper.properties
        ├── gradlew
        ├── gradlew.bat
        ├── settings.gradle
        └── src
            ├── main
            │   └── groovy
            └── test
                └── groovy
    

    2.添加源代码

    • 让我们添加一个测试包:
    mkdir -p src/test/groovy/org/gr8ex
    
    • 并进行测试 . 我正在使用 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!"
        }
    }
    
    • 让我们执行测试并检查它是否失败:
    gradle test
    
    • 是的,它失败了:
    /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
    
    • 让我们添加源文件夹
    mkdir -p src/main/groovy/org/gr8ex
    
    • 和一个源文件(我使用 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
        }
    }
    
    • 再次测试(使用 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
    

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

    3.创建jar可执行文件

    有几种方法可以实现这一点(如shadow plugin) . 我会坚持使用"fatjar"方法 .

    • 让我们在 build.gradle [5]中添加 fatjar 指令:
    task fatjar(type: Jar) {
        manifest {
            attributes 'Main-Class': 'org.gr8ex.Hello'
        }
        from { 
            configurations
                .runtime
                .collect { it.isDirectory() ? it : zipTree(it) }
        }
        with jar
    }
    
    • 包装它:
    gradle fatjar
    
    • 结果 jar 将在 builds/libs/gr8ex.jar 中 . 让我们执行它:
    $ java -jar build/libs/gr8ex.jar 
    Hello, World!
    
    • 利润!您可以使用intellij和(我相信)eclipse导入此项目 .

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

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

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

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

    [5]:如果你只是坚持使用 jar {} 指令,比如this answer,那么你将会得到一个非常薄的jar,它将缺少groovy库 . 这个"fatjar"将你的lib打包到jar中 . 根据您的使用情况,您可能需要稍微调整一下 .

  • 8

    使用Groovy Maven设置Eclipse可能会很好用 . 你只需要一个与此类似的pom.xml:

    ...
    <plugin>
            <artifactId>maven-compiler-plugin</artifactId>
            <version>3.2</version>
            <configuration>
              <source>1.7</source>
              <target>1.7</target>
              <compilerId>groovy-eclipse-compiler</compilerId>
              <useIncrementalCompilation>false</useIncrementalCompilation>
            </configuration>
            <dependencies>
              <dependency>
                <groupId>org.codehaus.groovy</groupId>
                <artifactId>groovy-eclipse-compiler</artifactId>
                <version>2.9.1-01</version>
              </dependency>
              <dependency>
                <groupId>org.codehaus.groovy</groupId>
                <artifactId>groovy-eclipse-batch</artifactId>
                <version>2.3.7-01</version>
              </dependency>
              <dependency>
                <groupId>org.codehaus.groovy</groupId>
                <artifactId>groovy</artifactId>
                <version>2.3.0</version>
              </dependency>
              <dependency>
                <groupId>org.apache.ivy</groupId>
                <artifactId>ivy</artifactId>
                <version>2.4.0</version>
              </dependency>
            </dependencies>
          </plugin>
          <plugin>
            <groupId>org.codehaus.groovy</groupId>
            <artifactId>groovy-eclipse-compiler</artifactId>
            <version>2.9.1-01</version>
            <extensions>true</extensions>
          </plugin>
          <plugin>
            <groupId>org.codehaus.mojo</groupId>
            <artifactId>build-helper-maven-plugin</artifactId>
            <version>1.9.1</version>
            <executions>
              <execution>
                <id>add-source</id>
                <phase>generate-sources</phase>
                <goals>
                  <goal>add-source</goal>
                </goals>
                <configuration>
                  <sources>
                    <source>wherever/you/like</source>          
                  </sources>
                </configuration>
              </execution>
            </executions>
          </plugin>
    ...
    <dependencies>
    ...
    <dependency>
          <groupId>org.codehaus.groovy</groupId>
          <artifactId>groovy-all</artifactId>
          <version>${groovyVersion}</version>
          <scope>provided</scope>
        </dependency>
    ...
    </dependencies>
    ...
    

    sources部分是可选的,因为它应该在src / main / groovy和src / test / groovy中查找你的源代码 . Eclipse应该能够将您的项目配置为maven项目,并自动获取Groovy性质 .

    由于您已在maven中配置了Groovy编译器,因此对 mvn install 的调用应生成.jar文件,并将Groovy类转换为.class文件 .

    至于主要方法,就像你通常使用maven一样:

    ...
    <plugin>
        <groupId>org.apache.maven.plugins</groupId>
        <artifactId>maven-jar-plugin</artifactId>
        <configuration>
            <archive>
                <manifest>
                    <mainClass>my.mainClass</mainClass>
                </manifest>
            </archive>
        </configuration>
    </plugin>
    ...
    

相关问题