2016-11-11 114 views
1

我試圖運行一個Java類作爲一個gradle任務。然而使用自定義類路徑在Gradle任務中運行Java類

task(downloadKeystore, dependsOn: 'classes', type: JavaExec) { 
    main = 'com.orbitbenefits.keystore.KeystoreDownloader' 
} 

,當我在命令行gradle downloadKeystore上運行時,出現以下錯誤:

我已經加入這個我build.gradle

:Noa:downloadKeystoreError: Could not find or load main class com.orbitbenefits.keystore.KeystoreDownloader 

所以我添加了一個類路徑我的任務如下:this question

task(downloadKeystore, dependsOn: 'classes', type: JavaExec) { 
    main = 'com.orbitbenefits.keystore.KeystoreDownloader' 
    classpath = sourceSets.main.runtimeClasspath 
} 

然而,這是非常長的類路徑中大的傳統項目,所以當我運行gradle downloadKeystore我得到另一個錯誤:

Caused by: java.io.IOException: Cannot run program "C:\Program Files\Java\jdk1.8.0_77\bin\java.exe" (in directory "C:\Users\pawlakj\IdeaProjects\noa\Noa"): CreateProcess error=206, The filename or extension is too long 

所以我修改了我sourceSetsbuild.gradle所以現在看起來是這樣的:

sourceSets { 
    main { 
     java { 
      srcDirs(...) 
     } 
     resources { 
      srcDirs(...) 
     } 
    } 

    keystore { 
     java { 
      srcDirs = ['src/test/java/com/orbitbenefits/keystore'] 
     } 
    } 

    test { 
     java { 
      srcDirs(...) 
     } 
     resources { 
      srcDirs(...) 
     } 
    } 
} 

... 

task(downloadKeystore, dependsOn: 'classes', type: JavaExec) { 
    main = 'com.orbitbenefits.keystore.KeystoreDownloader' 
    classpath = sourceSets.keystore.runtimeClasspath 
} 

這可以在命令行上運行,但是當我在IntelliJ中運行gradle刷新時,它通常會中斷項目。它看起來像這樣:

Broken IntelliJ

但它應該是這樣的:

Not-broken IntelliJ

我已經手動嘗試設置測試/ src目錄的根目錄,但它並沒有真正的工作,也是我不希望其他開發者必須這樣做。

我自己也嘗試手動設置classpath中使用類似:

classpath = classpath('src/test/java/com/orbitbenefits/keystore') 

但我無法使它工作(gradle這個不喜歡它)。

問題

我只需要解決這兩個問題之一:

我怎麼能手動定義的類路徑?

OR

我怎樣才能讓的IntelliJ利用其gradle這個刷新按鈕時不會弄亂項目結構?

回答

1

您的IntelliJ與srcDirs = ['src/test/java/com/orbitbenefits/keystore']存在問題,因爲src/test/java已經是包含某些源的文件夾。

一個解決辦法是定義一個新的文件夾同級src,你有你的KeystoreDownloader類,然後導入密鑰庫如下:

keystore { 
    java { 
     srcDirs = ['keystore'] 
    } 
}