2015-06-11 4 views
7

Fondamentalmente voglio fare qualcosa di semplice - o almeno penso che dovrebbe essere piuttosto semplice.intellij build jar artefatto contenente dipendenze gradle

Il mio obiettivo è creare un progetto gradino Intellij, aggiungere alcune dipendenze al modulo utilizzando gradle e aggiungere un codice sorgente java ad esso.

allora voglio solo avere la possibilità di compilare in qualche modo il tutto in 1 barattolo, contenente tutte le dipendenze di grado e di essere in grado di eseguire con "java-jar"

Tuttavia si è scoperto che questo non è così facile ho pensato.

Ho appena creato un nuovo progetto gradle da intellij e aggiunto una classe Main.

I'll darvi una panoramica sui miei file:

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

classe principale:

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

    } 
} 

Il metodo principale di "MyStart" è eseguito durante l'esecuzione da Intellij tramite debug. Quindi funziona, quando tutte le dipendenze vengono caricate correttamente.

NOTA: utilizzo Intellij Community Edition se questo fa alcuna differenza.

quello che ho provato:

1. Ho cercato di usare appena "gradlew generazione pulita".

Questo ha creato un barattolo, ma senza librerie. Ma non mi aspettavo che fosse così facile.

2. Ho cercato di costruire un manufatto del modulo come suggerito qui:

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

ho provato con le dipendenze estratti e non estratti. In entrambi i casi le dipendenze sono state aggiunte al barattolo, ma sono state aggiunte alla radice del barattolo. Quando ho provato a eseguire il file jar tramite "java-jar", si è lamentato:

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

OK, quindi riuscivo a caricare le dipendenze.
NOTA: ho pensato che le dipendenze non fossero state aggiunte al classpath, ma non ne sono sicuro. Tuttavia, mi aspetto che Intellij aggiunga dipendenze al classpath (o dichiari nel file manifest)

3. Ho anche provato a usare il plugin per l'applicazione gradle.

Tuttavia questo crea un file zip/tar che contiene uno script di esecuzione e una cartella bin che non era la mia intenzione.

Così ho iniziato a cercare su google per ore e ore, ma non riesco a trovare una soluzione al mio problema.

Dai, non può essere così difficile, è così semplice.

Sono sicuro che un genio può aiutarmi e indicarmi il mio - probabilmente stupido - fallimento.

risposta

7

La mia soluzione attuale è la seguente:

Io uso Gradle di costruire un barattolo contenente tutte le librerie, faccio questo compito servivano personalizzato chiamato fatJar.

Ecco una parte del mio 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 
} 

Poi ho solo eseguire "fatJar Gradle" sulla riga di comando e ottenere un vaso perfetto.