2015-06-11 2 views
7

Я в основном хочу сделать что-то простое - или, по крайней мере, я думаю, что это должно быть довольно просто.intellij build jar artifact, содержащий зависимости градиента

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

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

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

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

я дам вам обзор по моим файлам:

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 Community Edition, если это имеет значение.

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

1. Я попытался просто использовать "gradlew чистую сборку".

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

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

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

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

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

ОК, так couldn't загрузки зависимостей.
ПРИМЕЧАНИЕ. Я думал, что зависимости не были добавлены в путь к классам, но я не уверен в этом. Однако я бы ожидал, что Intellij добавит зависимости к пути к классам (или объявит в файле манифеста)

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

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

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

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

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

ответ

7

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

Я использую Gradle построить банку, содержащую все LIBS, я делаю это двухкомпонентной пользовательскую задачу под названием 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» в командной строке и получить идеальную банку.

Смежные вопросы