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