使用IntelliJ构建包含Gradle依赖项的Jar构件

12

我基本上想做一些简单的事情 - 或者至少我认为这应该相当简单。

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

然后,我只想有一个选项以某种方式将整个项目编译为一个包含所有gradle依赖项并能够使用“java -jar”执行的1个jar文件。

然而,结果证明这并不像我想象的那么容易。

我刚从Intellij创建了一个新的gradle项目并添加了一个Main类。

下面是我的文件概述:

settings.gradle:

rootProject.name = 'gradleTestNewJar'

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

主类:

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();

    }
}

当从Intellij通过调试运行时,“MyStart”类的主方法会被执行。只有在所有依赖项正确加载时,它才能正常工作。

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

我尝试了以下方法:

1. 我尝试仅使用“gradlew clean build”命令构建。

这创建了一个jar文件,但没有包含依赖库。但我没想到会这么简单。

2. 我尝试按照这里建议的方式构建模块的artifact:

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
..."

好的,它无法加载依赖项。
注意:我认为依赖项没有添加到类路径中,但我不确定。然而,我期望Intellij将依赖项添加到类路径中(或在清单文件中声明)。

3. 我还尝试使用Gradle应用程序插件。

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

所以我开始搜索了几个小时,但我找不到解决我的问题的方法。

来吧,这不可能那么难 - 它只是如此基础。

我相信一些天才可以帮助我指出我 - 可能很愚蠢的 - 失败。

1个回答

18

我的当前解决方案如下:

我使用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
}

然后我只需在命令行上执行"gradle fatJar",就可以得到一个完美的jar包。


工作得很好,注意我不得不稍微摆弄一下才找到它在libs目录中的jar包。 - Noam Segev

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接