артефакт jar сборки intellij, содержащий зависимости gradle

Я в принципе хочу сделать что-то простое - или, по крайней мере, я думаю, что это должно быть довольно просто.

моя цель-создать проект Intellij gradle, добавить некоторые зависимости к модулю с помощью gradle и добавить к нему исходный код java.

тогда я просто хочу иметь возможность каким-то образом скомпилировать все это в 1 банку, содержащую все зависимости класса и способную выполнять с помощью "java-jar"

однако оказалось, что это не так просто, как я думал.

Я только что создал новый проект gradle из intellij и добавил основной класс.

Я дам вам обзор моих файлов:

настройки.Gradle в:

rootProject.name = 'gradleTestNewJar'

построить.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 через debug. Поэтому он работает, когда все зависимости загружаются правильно.

примечание: Я использую Intellij Community Edition, Если это имеет значение.

что я пробовал:

1. Я попытался просто использовать "gradlew clean build".

это создало банку, но без libs. Но я не ожидал, что все будет так просто.

2. Я попытался построить артефакт модуля, как предложено здесь:

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

я попробовал его с извлеченными и не извлеченными зависимостями. В обоих случаях зависимости были добавлены в банку, но они были добавлены в корень банки. Когда я попытался запустить файл jar через "java-jar", он пожаловался:

"Exception in thread "main" java.lang.NoClassDefFoundError: org/openqa/selenium/WebDriver
..."

OK, поэтому он не смог загрузить зависимости.
Примечание: Я думал, что зависимости не были добавлены в classpath, но я не уверен в этом. Однако я ожидаю, что Intellij добавит зависимости к пути к классам (или объявит в файле манифеста)

3. Я также попытался использовать плагин приложения gradle.

однако это создает zip / tar, который содержит скрипт execute и папку bin, которая не была моей целью.

поэтому я начал гуглить часами, но я не могу найти решение своей проблемы.

давай это не может быть так сложно - это просто так просто.

Я уверен, что какой - нибудь гений может помочь мне и указать мне на мою - вероятно, глупую-неудачу.

1 ответов


мое текущее решение выглядит следующим образом:

Я использую gradle для создания банки, содержащей все библиотеки, я делаю это с пользовательской задачей под названием fatJar.

вот часть из моей сборки.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" в командной строке и получаю идеальную банку.