2014-03-27 71 views
17

因爲我的Java源代碼和目標必須兼容JRE 1.6,所以我需要將options.bootClasspath設置爲包含1.6版本rt.jarjce.jar的路徑。它必須建立在Windows和Unix(Linux/Solaris)上。什麼是正確的方法來做到這一點?我現在用下面的辦法在我的頂級build.gradle,它的工作原理,但似乎遠沒有優雅,尤其是依賴於操作系統的分離:;如何以獨立於操作系統的方式設置Gradle`options.bootClasspath`?

import org.apache.tools.ant.taskdefs.condition.Os 

subprojects { 
    apply plugin: 'java' 

    compileJava { 
    sourceCompatibility = 1.6 
    targetCompatibility = 1.6 
    def java6_home = System.getenv("JAVA_HOME_6") 
    def java6_lib = "C:/localdata/Program Files (x86)/Java/jdk1.6.0_45/jre/lib/" 

    if (java6_home != null) { 
     java6_lib = java6_home + "/jre/lib/" 
    } 

    def sep = ':' 
    if (Os.isFamily(Os.FAMILY_WINDOWS)) { 
     sep = ';' 
    } 
    options.bootClasspath = java6_lib + "rt.jar" + sep + java6_lib + "jce.jar" 
    } 
} 
+0

在[File]中有[separator]和'pathSeparator',在[this question]中引用(http://stackoverflow.com/questions/3548775/platform-independent-paths-in-java)。這應該會緩解你的一些優雅問題。 – Patru

+0

Thanx,使用'File.pathSeparator'保存5行代碼:-) –

回答

26

我使用下面的代碼(假設JDK6_HOME指向JDK 1.6安裝的根目錄):

tasks.withType(JavaCompile) { 
    doFirst { 
     if (sourceCompatibility == '1.6' && System.env.JDK6_HOME != null) { 
      options.fork = true 
      options.bootClasspath = "$System.env.JDK6_HOME/jre/lib/rt.jar" 
      options.bootClasspath += "$File.pathSeparator$System.env.JDK6_HOME/jre/lib/jsse.jar" 
      // use the line above as an example to add jce.jar 
      // and other specific JDK jars 
     } 
    } 
} 

此方法可以自動檢測環境變量的存在,並自動設定bootClasspath該申報sourceCompatibility爲1.6的所有模塊。

當您使用bootClasspath時需要options.fork = true

+2

Thanx!使用File.pathSeparator可以保存5行代碼。但是,我懷疑是否需要'options.fork = true'。用戶指南說:「默認情況下,Java編譯器在Gradle進程中運行。將options.fork設置爲true將導致在單獨的進程中發生編譯 。在Ant javac任務的情況下,這意味着每個編譯任務都會分配一個新進程,這會降低編譯速度。「 –

+2

http://www.gradle.org/docs/current/dsl/org。 gradle.api.tasks.compile.CompileOptions.html#org.gradle.api.tasks.compile.CompileOptions:bootClasspath:只有在fork爲真的情況下才會生效。 –

+0

Thanx給出正確的ref。所以我猜想沒有辦法解決所產生的編譯速度變慢的問題:-( –

0

通過以上的Oleg Estekhin冷溶液的輕微的修改,但不要求JDKX_HOME被設定(計算它在飛行)另外,修改後用於做Java 1.7構建:

tasks.withType(JavaCompile) { 
    doFirst { 
     if (sourceCompatibility == '1.7') { 
      def JDK7_HOME = "/usr/libexec/java_home -v 1.7".execute().text.trim() 
      options.bootClasspath = "$JDK7_HOME/jre/lib/rt.jar" 
      options.bootClasspath += "$File.pathSeparator$JDK7_HOME/jre/lib/jsse.jar" 
      // use the line above as an example to add jce.jar 
      // and other specific JDK jars 
     } 
    } 
} 
+1

使用'/ usr/libexec/java_home'檢測java home時,'$ File.pathSeparator'的平臺無關性會丟失。 – willkil

1

的可接受的答案可以工作,但如果您在java.lang之外使用某些類(例如javax.crypto.*),則可能會發現您會因爲需要將更多JAR文件添加到bootClasspath而引發各種ClassNotFoundExceptionException。

爲了避免這種情況,我使用了下列優點:如果需要的話

  • 所有JAR文件添加到BOOTCLASSPATH
  • 的extensionDirs也設置

    tasks.withType(JavaCompile) { 
        doFirst { 
         if (JavaVersion.toVersion(sourceCompatibility) == JavaVersion.VERSION_1_6 
          && JavaVersion.current() != JavaVersion.VERSION_1_6 
          && System.env.JDK6_HOME != null) { 
          options.fork = true 
          options.bootClasspath = fileTree(include: ['*.jar'], dir: "$System.env.JDK6_HOME/jre/lib/").join(File.pathSeparator) 
          options.extensionDirs = "$System.env.JDK6_HOME/jre/lib/ext/" 
         } 
        } 
    } 
    
  • 0

    我試着添加很多jar到我的bootClassPath使用上面的說明,但從未解決我的構建問題。我最終通過將我的JAVA_HOME指向WebSphere服務器所需的IBM JDK 1.7並將其添加到我的路徑來解決了構建問題。我的其他項目需要Oracle JDK 1.8,所以我不想將此更改永久化。

    set JAVA_HOME="C:\Program Files (x86)\IBM\WebSphere\AppServer\java_1.7.1_64\" 
    set PATH=%JAVA_HOME%\bin;%PATH% 
    gradle clean war 
    gradle clean ear deployLocal 
    
    相關問題