intellij构建包含gradle依赖项的jar工件

Luk*_*kor 9 java jar build intellij-idea gradle

我基本上想做一些简单的事情 - 或者至少我觉得它应该很简单.

我的目标是创建一个Intellij gradle项目,使用gradle为模块添加一些依赖项,并为其添加一些java源代码.

然后我只想有一个选项以某种方式将整个事物编译成1个jar,包含所有等级依赖项并且能够使用"java -jar"执行

然而事实证明,这并不像我想象的那么容易.

我刚从intellij创建了一个新的gradle项目,并添加了一个Main类.

我会给你一个关于我的文件的概述:

settings.gradle:

rootProject.name = 'gradleTestNewJar'
Run Code Online (Sandbox Code Playgroud)

的build.gradle:

apply plugin: 'java'
apply plugin: 'idea'
apply plugin: 'application'

sourceCompatibility = 1.6
version = '1.0'

repositories {
    mavenCentral()
}

mainClassName = "com.randomPackage.StarterClass"

    dependencies {

        compile 'org.seleniumhq.selenium:selenium-java:2.46.0'

        testCompile group: 'junit', name: 'junit', version: '4.11'
    }
Run Code Online (Sandbox Code Playgroud)

主要课程:

package com.randomPackage;

import com.gargoylesoftware.htmlunit.BrowserVersion;
import org.openqa.selenium.WebDriver;
import org.openqa.selenium.htmlunit.HtmlUnitDriver;

public class StarterClass {

    public static void main(String[] args){
        System.out.println("test");

        WebDriver driver = new HtmlUnitDriver(BrowserVersion.FIREFOX_38);
        driver.quit();

    }
}
Run Code Online (Sandbox Code Playgroud)

当从Intellij通过debug运行时,执行"MyStart"的主要方法.因此,当所有依赖项都正确加载时,它可以工作.

注意:如果这有任何区别,我使用Intellij Community Edition.

我尝试了什么:

我试着用"gradlew clean build".

这创建了一个jar,但没有libs.但我没想到它会像这样容易.

2.我尝试按照此处的建议构建模块的工件:

http://blog.jetbrains.com/idea/2010/08/quickly-create-jar-artifact/

我尝试了提取和未提取的依赖项.在这两种情况下,依赖项都被添加到jar中,但它们被添加到jar的根目录中.当我试图通过"java -jar"运行jar文件时,它抱怨道:

"Exception in thread "main" java.lang.NoClassDefFoundError: org/openqa/selenium/WebDriver
..."
Run Code Online (Sandbox Code Playgroud)

好的,所以它无法加载依赖项.
注意:我认为依赖项没有添加到类路径中,但我不确定这一点.但是,我希望Intellij将依赖项添加到类路径中(或在清单文件中声明)

3.我也尝试使用gradle应用程序插件.

但是这会创建一个zip/tar,其中包含一个执行脚本和一个bin文件夹,这不是我的意图.

所以我开始谷歌搜索几个小时,但我无法找到解决问题的方法.

来吧这不可能这么难 - 它是如此基本.

我相信一些天才可以帮助我,并指出我 - 可能是愚蠢的 - 失败.

Luk*_*kor 9

我目前的解决方案如下:

我使用gradle来构建一个包含所有库的jar,我这样做的是一个名为fatJar的自定义任务.

这是我的build.gradle的一部分

apply plugin: 'java'

jar {
    manifest {
        attributes("Manifest-Version": "1.0",
                "Main-Class": "com.randomPackage.MainClass");
    }
}

task fatJar(type: Jar) {
    manifest.from jar.manifest
    classifier = 'all'
    from {
        configurations.runtime.collect { it.isDirectory() ? it : zipTree(it) }
    } {
        exclude "META-INF/*.SF"
        exclude "META-INF/*.DSA"
        exclude "META-INF/*.RSA"
    }
    with jar
}
Run Code Online (Sandbox Code Playgroud)

然后我在命令行执行"gradle fatJar"并得到一个完美的jar.