2013-06-14 11 views
5

Ich verwende Gradle mit dem Eclipse-Plugin, um Projektdateien für mein Projekt zu generieren, aber ich kann nicht die richtige JRE-Version in .classpath setzen. Ich kann hinzufügen einen JRE-Container, aber ich kann nicht herausfinden, wie man den Standard-entfernen - und da dieses Projekt zwischen Entwicklern geteilt wird, die unterschiedliche Standardeinstellungen in Eclipse haben, möchte ich dies manuell steuern.Auswahl der richtigen JRE-Version in Gradle mit Eclipse

Die Art, wie ich denke, diese sollte Arbeit, ist in etwa so:

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

sourceCompatibility = 1.6 

Seit targetCompatibility als sourceCompatibility das gleiche ist, wie ich dieses Setup erwarte die Eclipse-Einstellungen zu gehen, eine JRE finden, die die Spiele Source-Version (und ja, es ist eine auf meinem Rechner - sowohl eine JRE-Installation und eine separate JDK-Installation) und gehen damit.

Statt jedoch nimmt es den Standard, die auf meinem Rechner Java 7.

ich in der Eclipse-Konfiguration ein paar Sachen hinzugefügt versucht werden passiert:

eclipse { 
    jdt { 
     sourceCompatibility = 1.6 // tried with and without this 
    } 
    classpath { 
     // tried various ways to remove the old entry, among them: 
     file.beforeMerged { p -> p.entries.clear() } 

     // and then I add the "correct" one 
     containers 'org.eclipse.jdt.launching.JRE_CONTAINER/org.eclipse.jdt.internal.debug.ui.launcher.StandardVMType/jdk1.6.0_45' 
    } 
} 

Dinge zu tun, wie dies Ich beende up mit zwei JRE Container in .classpath:

<?xml version="1.0" encoding="UTF-8"?> 
<classpath> 
    <classpathentry kind="output" path="bin"/> 
    <classpathentry kind="con" path="org.eclipse.jdt.launching.JRE_CONTAINER" exported="true"/> 
    <classpathentry kind="con" path="org.eclipse.jdt.launching.JRE_CONTAINER/org.eclipse.jdt.internal.debug.ui.launcher.StandardVMType/jdk1.6.0_45" exported="true"/> 
</classpath> 

Wie kann ich te ll Gradle, dass ich nur will ein JRE 1.6 Container, und nicht der Standard auch zu?


Einige Einschränkungen auf, was ich nach:

  • Die Standardeinstellung in Eclipse sollte
  • Vorzugsweise irrelevant sein, möchte ich das Skript die Container zu sehen - in dem obigen Skript Die Zeichenfolge, die den hinzuzufügenden Container definiert, ist benutzerabhängig. Ich würde es gerne viel besser unter "Installierte JREs" nach einer Version suchen, die der von sourceConfiguration entspricht - Ich bin OK mit dem Werfen eines Fehlers, wenn keine solche JRE in Eclipse installiert ist.
+1

auch: für eine Art und Weise Bonuspunkte, die den Bootstrap-Classpath richtig konfiguriert 'Warnung zu vermeiden: [Optionen] Bootstrap-Klassenpfad nicht gesetzt in Verbindung mit "Quelle 1.6" in einer Weise, die benutzerunabhängig ist (dh den Weg zur JRE auf intelligente Weise nach oben zu suchen). –

Antwort

4

Ich habe es gelöst, etwas mehr manuell als ich wollte - aber zumindest funktioniert es.

Um die Einstellungen von der Implementierung zu trennen, hat jeder Entwickler eine gradle.properties-Datei, die nicht in die Versionskontrolle eingecheckt wird. Diese Datei enthält die folgenden Informationen (auf meinem Arbeitsplatz):

javaVersion=1.6 
javaPath=C:/Program/Java/jdk1.6.0_45 
jdkName=jdk1.6.0_45 

Im Build-Skript, ich dann erhalte die folgende, um die gesamte Konfiguration korrekt:

// Set sourceCompatibility 
if (project.hasProperty('javaVersion')) { 
    project.sourceCompatibility = project.javaVersion 
} 

// Set bootClasspath - but wait until after evaluation, to have all tasks defined 
project.afterEvaluate { 
    if (project.hasProperty('javaPath')) { 
     project.tasks.withType(AbstractCompile, { 
      it.options.bootClasspath = "${project.javaPath}/jre/lib/rt.jar" 
     }) 
    } 
} 

// Configure Eclipse .classpath 
project.eclipse.classpath.file.whenMerged { Classpath cp -> 
    if (project.hasProperty('jdkName') { 
     cp.entries.findAll { it.path.contains('JRE_CONTAINER') }.each { 
      it.path += "/org.eclipse.jdt.internal.debug.ui.launcher.StandardVMType/$project.jdkName" 
     } 
    } 
} 

Bisher habe ich es benutzt in ein paar Projekten und es hat funktioniert, also denke ich, es ist zumindest ziemlich portabel - aber es könnte notwendig sein, geringfügige Änderungen vorzunehmen, damit es für andere funktioniert.

2

Ich fand, dass die vorgeschlagene Lösung doppelte Einträge bei nachfolgenden "Graples Eclipse" -Ausführungen verursacht.Kreditaufnahme einiger Codes aus Specifiy JRE Container with gradle eclipse plugin, kam ich mit dem folgenden auf die zu funktionieren scheint:

project.afterEvaluate { 
    // use jre lib matching version used by project, not the workspace default 
    if (project.sourceCompatibility != null) { 
    def target = project.sourceCompatibility.toString() 
    def containerPrefix = "org.eclipse.jdt.launching.JRE_CONTAINER" 
    def containerSuffix 
    if (target =~ /1.[4-5]/) { 
     containerSuffix = '/org.eclipse.jdt.internal.debug.ui.launcher.StandardVMType/J2SE-' + target 
    } else if (target =~ /1.[6-8]/) { 
     containerSuffix = '/org.eclipse.jdt.internal.debug.ui.launcher.StandardVMType/JavaSE-' + target 
    } 
    if (containerSuffix != null) { 
     project.eclipse.classpath { 
     containers.removeAll { it.startsWith(containerPrefix) } 
     containers.add(containerPrefix + containerSuffix) 
     } 
    } 
    } 
} 
Verwandte Themen