Gradle einsetzen um Eclipse Projekte zu erstellen

Warum soll man ein Build Tool verwenden, um ein Eclipse Projekt zu erstellen, welches nur einmal erstellt wird? Arbeitet man mit mehreren Entwicklern, die vielleicht auch noch auf mehreren Plattformen (Linux, Windows, Mac OS X) unterwegs sind, möchte man vielleicht nicht die Eclipse Projekt Dateien in seiner Versionskontrolle hinterlegen. Aber man möchte sicherlich, dass jeder, bei der Erstellung des eigenen Eclipse Projektes, die identischen Rahmenbedingungen schafft. Es sollen die gleichen Quell und Ziel Verzeichnisse verwendet werden, die externen Library Versionen sollten auch zueinander passen.

Dies könnte also durchaus einen Sinn ergeben, warum man das Eclipse Projekt nicht nur einmal, sondern eben mehrmals erstellt und vielleicht aktualisiert, wenn neue Bibliotheken in das Projekt eingebunden werden.

Was muss man also machen, um mit Hilfe von Gradle solch eine Unterstützung zu erreichen.

Gradle arbeitet mit verschiedenen Plugins, diese werden einfach durch das Schlüsselwort apply eingebunden, da gibt es auch ein entsprechendes für Eclipse, und da es sich um ein Java Projekt handeln soll, wird dieses Plugin auch gleich verwendet.

build.gradle:

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

Mit dem Aufruf gradle eclipse werden die entsprechenden Eclipse Dateien angelegt

Ergebnis:

- .classpath
- .project
- .settings
  - org.eclipse.jdt.core.prefs

.classpath

<?xml version="1.0" encoding="UTF-8"?>
<classpath>
	<classpathentry kind="output" path="bin"/>
	<classpathentry kind="src" path="src/main/java"/>
	<classpathentry kind="con" path="org.eclipse.jdt.launching.JRE_CONTAINER" exported="true"/>
</classpath>

Was direkt funktioniert ist das automatische Setzen des Quellverzeichnis, mit dem Wert src/main/java. Was leider nicht funktioniert, ist das verwenden des identischen Ausgabeverzeichnis (kann natürlich Absicht sein, aber ich fand es schon zu Ant Zeiten besser, die Verzeichnisse synchron zu halten), welches build/classes/main anstatt bin entsprechen würde.

Aber man kann in Gradle ja alles beeinflussen. Also soll hier das identische Ausgabeverzeichnis verwendet werden.

build.gradle mit definiertem Ausgabeverzeichnis:

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

eclipse {
  classpath {
    defaultOutputDir = compileJava.destinationDir
  }
}

Es wird mit dem classpath die entsprechend zu erzeugende Datei manipuliert und mit defaultOutputDir der output Teil in der .classpath Datei gesteuert. compileJava ist ein Task der aus dem Java Plugin eingebunden wurde und der für den Compile Vorgang der Java Objekte zuständig ist. Im Attribute destinationDir wird das entsprechende classes-Ausgabeverzeichnis referenziert.

Mit dem Aufruf von gradle eclipse werden die Dateien erneut geschrieben. Aber halt, man sollte vorher ein gradle cleanEclipse ausführen, denn sonst hat man auf einmal zwei out Elemente, das Gradle die Datei nicht einfach überschreibt, sondern nur Neuerungen/Änderungen bearbeitet.

.classpath mit angepasstem output

<?xml version="1.0" encoding="UTF-8"?>
<classpath>
	<classpathentry kind="src" path="src/main/java"/>
	<classpathentry kind="con" path="org.eclipse.jdt.launching.JRE_CONTAINER" exported="true"/>
	<classpathentry kind="output" path="build/classes/main"/>
</classpath>

Als abschließenden Schritt, soll das Projekt einen Namen in Eclipse bekommen und eine externe Library (Java Mail) soll noch eingebunden werden.

build.gradle erweitert:

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

repositories {
	mavenCentral()
}

configurations {
    mail
}

dependencies {
    mail 'javax.mail:mail:1.4.6'
}

eclipse {
  project {
    name = 'MyMailExample'
  }

  classpath {
    plusConfigurations += configurations.mail

    defaultOutputDir = compileJava.destinationDir
  }
}

Wie man eine externe Lib in Gradle einbindet, wird hier beschrieben. Hier neu ist der Teil project { }, der so zu erwarten war und wichtiger die externe Lib. plusConfiguration += configurations.mail, dadurch wird auf den Bereich configurations zugegriffen und auf die Entsprechende Bibliothek mail. Diese wird dann im .classpath eingefügt.

.classpath mit externer Lib:

<?xml version="1.0" encoding="UTF-8"?>
<classpath>
	<classpathentry kind="src" path="src/main/java"/>
	<classpathentry kind="con" path="org.eclipse.jdt.launching.JRE_CONTAINER" exported="true"/>
	<classpathentry kind="output" path="build/classes/main"/>
	<classpathentry sourcepath="/Users/beispiel/.gradle/caches/artifacts-23/filestore/javax.mail/mail/1.4.6/source/8ddcd26291a284821bc93a342733bea80cc65db7/mail-1.4.6-sources.jar" 
             kind="lib" path="/Users/beispiel/.gradle/caches/artifacts-23/filestore/javax.mail/mail/1.4.6/jar/383bdbd7b4bc3e7960370db219f883b4062fc1ca/mail-1.4.6.jar" exported="true"/>
	<classpathentry sourcepath="/Users/beispiel/.gradle/caches/artifacts-23/filestore/javax.activation/activation/1.1/source/3697e9f67a2ed7ac5f589cff30f21173299440/activation-1.1-sources.jar" 
             kind="lib" path="/Users/beispiel/.gradle/caches/artifacts-23/filestore/javax.activation/activation/1.1/jar/e6cb541461c2834bdea3eb920f1884d1eb508b50/activation-1.1.jar" exported="true"/>
</classpath>

.project mit dem neuen Namen:

<?xml version="1.0" encoding="UTF-8"?>
<projectDescription>
	<name>MyMailExample</name>
	<comment/>
	<projects/>
	<natures>
		<nature>org.eclipse.jdt.core.javanature</nature>
	</natures>
	<buildSpec>
		<buildCommand>
			<name>org.eclipse.jdt.core.javabuilder</name>
			<arguments/>
		</buildCommand>
	</buildSpec>
	<linkedResources/>
</projectDescription>

Schreibe einen Kommentar

Deine E-Mail-Adresse wird nicht veröffentlicht. Erforderliche Felder sind mit * markiert.