2014-01-20 9 views
7

Ich habe eine funktionierende Maven-Build (siehe unten), die ein paar ausführbare Dateien vorbereitet, um als zwei separate Prozesse zu starten.Mehrere Startskripte mit Gradle

Obwohl dies funktioniert, wie kann dies mit Gradle getan werden? Ich sehe, dass Gradle ein Plugin namens application bietet, aber es fällt mir schwer, ein schönes Beispiel dafür zu finden, wie man es bei der Eingabe von: gradle stage 2 ausführbare Dateien erstellen kann.

Gerade jetzt, wenn ich stage nenne es nur eine ausführbare Datei auf dem "root" Mainclass in meinem gradle Skript definiert lautet:

apply plugin: 'java' 
apply plugin: 'application' 

mainClassName = 'SpringLauncher' 
applicationName = 'foo' 
compileJava.options.encoding = 'UTF-8' 
targetCompatibility = '1.7' 
sourceCompatibility = '1.7' 

task stage(dependsOn: ['clean', 'installApp', 'hello']) 

Und das Maven Build:

<build> 
<plugins> 
    <plugin> 
    <groupId>org.codehaus.mojo</groupId> 
     <artifactId>appassembler-maven-plugin</artifactId> 
     <version>1.1.1</version> 
     <configuration> 
     <assembleDirectory>target</assembleDirectory> 
     <programs> 
      <program> 
       <mainClass>foo.bar.scheduler.SchedulerMain</mainClass> 
       <name>scheduler</name> 
      </program> 
      <program> 
       <mainClass>SpringLauncher</mainClass> 
       <name>web</name> 
      </program> 
     </programs> 
     </configuration> 
     <executions> 
      <execution> 
       <phase>package</phase><goals><goal>assemble</goal></goals> 
      </execution>    
     </executions> 
    </plugin> 
</plugins> 

Antwort

9

Leider ist die gradle Anwendung Plugin nicht Unterstützung der ersten Klasse bietet.

Glücklicherweise, weil Gradle Skripte groovy sind, können Sie ändern, was das Anwendungsplugin recht einfach macht.

Die documentation for the Application plugin zeigen, dass die startScripts Aufgabe vom Typ CreateStartScripts, so versuchen, sich eine zweite Aufgabe des gleichen Typs in Ihrer Distribution

task schedulerScripts(type: CreateStartScripts) { 
    mainClassName = "foo.bar.scheduler.SchedulerMain" 
    applicationName = "scheduler" 
    outputDir = new File(project.buildDir, 'scripts') 
    classpath = jar.outputs.files + project.configurations.runtime 
} 

dann umfassen die Ausgabe dieser Aufgabe die Schaffung

applicationDistribution.into("bin") { 
      from(schedulerScripts) 
      fileMode = 0755 
} 
+2

Das Hinzufügen von 'duplicatesStrategy = 'exclude''zu der Kopieraufgabe wird die doppelten Skripte innerhalb des' bin/'-Verzeichnisses beseitigen. – Whymarrh

2

Es könnte besser sein, JavaExec

task scheduler(type: JavaExec) { 
    main = "foo.bar.scheduler.SchedulerMain" 
    classpath = sourceSets.main.runtimeClasspath 
} 

task web(type: JavaExec) { 
    main = "SpringLauncher" 
    classpath = sourceSets.main.runtimeClasspath 
} 
zu verwenden

können Sie dann gradle scheduler web laufen für mehrere ausführbare Skripte

+0

Das wird ihm mit Skripten nicht helfen, auf Heroku zu verwenden, obwohl ... –

Verwandte Themen