【问题标题】:intellij build jar artifact containing gradle dependenciesintellij 构建包含 gradle 依赖项的 jar 工件
【发布时间】:2015-08-27 18:03:09
【问题描述】:

我基本上想做一些简单的事情——或者至少我认为它应该很简单。

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

然后我只想有一个选项以某种方式将整个东西编译成 1 个 jar,包含所有等级依赖项并能够使用“java -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();

    }
}

“MyStart”的主要方法是在通过调试从 Intellij 运行时执行的。 因此,当所有依赖项都正确加载时,它就可以工作了。

注意:如果这有什么不同,我会使用 Intellij 社区版。

我尝试了什么:

1。我试图只使用“gradlew clean build”。

这创建了一个 jar,但没有库。 但没想到会这么简单。

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

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

3。我也尝试过使用 gradle 应用插件。

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

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

来吧,这不是那么难——它就是这么简单。

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

【问题讨论】:

    标签: java intellij-idea jar gradle build


    【解决方案1】:

    我目前的解决方案如下:

    我使用 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
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2020-08-27
    • 2014-04-02
    • 2012-04-01
    • 1970-01-01
    • 1970-01-01
    • 2011-07-04
    • 1970-01-01
    相关资源
    最近更新 更多