我正在尝试将Java类作为gradle任务运行。
我已将此添加到我的build.gradle
:
task(downloadKeystore, dependsOn: 'classes', type: JavaExec) {
main = 'com.orbitbenefits.keystore.KeystoreDownloader'
}
但是,当我在命令行gradle downloadKeystore
上运行时,它会因以下错误而失败:
: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
所以我修改了sourceSets
中的build.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 refresh时,它通常会破坏项目。它看起来像这样:
但它应该是这样的:
我尝试手动设置test / src根目录,但它确实不起作用,而且我也不希望其他开发人员必须这样做。
我也尝试使用类似的方法手动设置classpath:
classpath = classpath('src/test/java/com/orbitbenefits/keystore')
但是我无法让它发挥作用(gradle并不喜欢它)。
问题
我只需要解决这两个问题中的一个:
如何手动定义类路径?
OR
如何在使用其gradle刷新按钮时使IntelliJ不会弄乱项目结构?
答案 0 :(得分:1)
您的IntelliJ遇到srcDirs = ['src/test/java/com/orbitbenefits/keystore']
问题,因为src/test/java
已经是包含某些来源的文件夹。
一种解决方案可能是定义一个新的文件夹兄弟到src
,你有KeystoreDownloader
类,然后按如下方式导入密钥库:
keystore {
java {
srcDirs = ['keystore']
}
}