2015-08-24 59 views
0

我試圖將一個java項目的依賴關係複製到lib文件夾,然後從lib文件夾的jar副本列表中產生Class-Path屬性的值。Gradle同步任務不一致

這裏是build.gradle文件 -

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

sourceCompatibility = 1.8 

repositories { 
    mavenCentral() 
} 

libsDirName = 'package' 

ext { 
    libDir = file('build/dependencies/lib') 
} 

task syncDependencies(type: Sync) { 
    from configurations.runtime 
    into libDir 
} 

jar { 
    manifest { 
     attributes(
      "Class-Path": libDir.listFiles().collect { 'lib/' + it.getName() }.join(' ') 
     ) 
    } 
} 

jar.dependsOn syncDependencies 

dependencies { 
    //external compile dependencies 
    compile 'org.eclipse.persistence:javax.persistence:2.1.0' 
} 

當我執行gradle clean jar,它會將依賴關係lib文件夾,但Class-Path屬性的值是空白。如果我再次執行gradle clean jar,它會爲Class-Path屬性生成適當的值。

但是,如果我執行gradle clean後跟gradle clean jar,則Class-Path的值再次爲空。我正在使用Gradle 2.6

回答

0

屬性在第一次執行時保持爲空的原因gradle clean jar是您混淆了build lifecycle phases

libDir.listFiles().collect { 'lib/' + it.getName() }.join(' ')在項目配置時進行評估,lib目錄在項目執行時由syncDependencies任務填充。

爲了正確設置Class-Path屬性,在配置階段你可以這樣做:

jar { 
    manifest { 
     attributes(
      "Class-Path": configurations.runtime.collect { "lib/$it.name" }.join(' ') 
     ) 
    } 
} 

或者仍然可以在執行階段做到以下幾點:

jar { 
    doFirst { 
     manifest { 
      attributes(
       "Class-Path": libDir.listFiles().collect { 'lib/' + it.getName() }.join(' ') 
      ) 
     } 
    } 
} 
+1

瞭解在配置階段執行什麼以及在執行階段執行什麼是Gradle中最困難的部分(至少對我而言)。 – shailendra