2016-11-11 119 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'] 
    } 
}