2016-02-06 14 views
7

Ich muss meinem jar Standard-JVM-Optionen hinzufügen, wenn ich mit Gradle arbeite. Ich Aus der Dokumentation bekam, dass ich setzen:Wie füge ich Standard-JVM-Argumente mit Gradle hinzu

applicationDefaultJvmArgs = ["-Djavafx.embed.singleThread=true"] 

Ich habe nicht viel Erfahrung mit Gradle und dem Entwickler, der die build.gradle Datei geschrieben schrieb es anders aus, was die meisten Websites geben als Beispiele. Hier

ist die build.gradle:

apply plugin: 'java' 
apply plugin: 'eclipse' 

version = '0.1' 

repositories { 
    mavenCentral() 
} 

dependencies { 
    testCompile group: 'junit', name: 'junit', version: '4.+' 
    compile 'placeholder' 
} 

task release(type: Jar) { 
    manifest { 
     attributes("Implementation-Title": "placeholder", 
       "Implementation-Version": version, 
       'Main-Class': 'placeholder.Application') 
    } 
    from { configurations.compile.collect { it.isDirectory() ? it : zipTree(it) } } 

    with jar 
} 

task wrapper(type: Wrapper) { 
    gradleVersion = '2.2.1' 
} 

Ich weiß nicht, wo die Argumente zu setzen. Ich versuchte, sie an verschiedenen Standorten setzen, aber ich habe immer bekommen:

A problem occurred evaluating root project 'placeholder'. 
> No such property: applicationDefaultJvmArgs for class: org.gradle.api.tasks.bundling.Jar_Decorated 

Vielen Dank, Jhonny

+0

Wann müssen Sie den JVM-Parameter hinzufügen? Könnten Sie einfach die Systemvariable in der Static der Initialisierung Ihrer Hauptklasse setzen? – Ethan

+0

Ich muss den Parameter zur Kompilierzeit hinzufügen, so dass der Benutzer es nicht manuell hinzufügen muss, wenn er seine .jar – Jhonny007

+0

Sie können etwas wie 'System.setproperty (" javafx.embed.singleThread "," true ")' in Code, aber Sie werden sicherstellen, dass diese Anweisung ausgeführt wird, bevor die Systemeigenschaft irgendwo aufgerufen wird. – KKishore

Antwort

15

Von der Spitze von meinem Kopf ich 2 Möglichkeiten denken kann:

Option1: Tu, was @Ethan sagte, es wird wahrscheinlich arbeiten:

package placeholder; 

//your imports 

public class Application{ 
    static { 
     System.getProperties().set("javafx.embed.singleThread", "true"); 
    } 
    // your code 
    public static void main(String... args){ 
    //your code 
    } 
} 

Option 2: Verwenden Sie die Anwendung Plugin + Standardwerte jvm

build.gradle:

apply plugin: 'application' 
//your code 
applicationDefaultJvmArgs = ["-Djavafx.embed.singleThread=true"] 

Jetzt können Sie Ihren Code 2 Arten ausführen:

Von gradle

$gradle run 

Von Verteilung (Skript). aus dem generierten Skript, das die Anwendung Plugin zur Verfügung stellt:

$gradle clean build distZip 

Dann eine Zip-Datei ${your.projectdir}/build irgendwo unter gradle generiert. Finden Sie die Zip-Datei und entpacken Sie sie. Unter /bin finden Sie die ausführbaren Dateien ${yourproject}.bat und ${yourproject}. Eines ist für Linux/Mac/Unix (${yourproject}) das andere ist für Fenster (${yourproject.bat})

+0

Vielen Dank, die zweite Option funktioniert. Die erste Option sah aus wie es funktionierte, aber nur in IntelliJ. Das Glas scheint zu habe eine andere Ausführungsreihenfolge, also hat es dort nicht funktioniert. – Jhonny007

0

applicationDefaultJvmArgs wird durch die Application Plugin zur Verfügung gestellt. Wenn Sie dieses Plugin anwenden, wird der Fehler wahrscheinlich verschwinden und Sie sollten das Programm ausführen können, indem Sie gradle run ausgeben, sobald Sie die Eigenschaft mainClassName auf den vollständig qualifizierten Klassennamen setzen, dessen Hauptmethode Sie aufrufen möchten.

+2

Ok, nach genauerer Betrachtung ermöglicht das Application-Plugin nur die Ausführung der jvm-Parameter Gradel run. Aber ich brauche sie durch die .jar ausgeführt werden, wenn der Verbraucher die Anwendung starten möchte. – Jhonny007

0

können Sie Befehlszeile mit gradle Aufgabe verwenden:

class AppRun extends JavaExec { 
    private boolean withDebug 

    @Option(option = "with-debug", description = "enable debug for the process. ") 
    public void setDebugMode(boolean debug) { 
     this.withDebug = debug 
    } 

    public boolean getDebugMode() { 
     return this.withDebug 
    } 
} 

task run(type: AppRun) { 
} 

dann laufen Aufgabe mit Optionen

Gradle run --with-debug