使用自定义类路径

时间:2016-11-11 12:02:59

标签: java intellij-idea gradle

我正在尝试将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时,它通常会破坏项目。它看起来像这样:

Broken IntelliJ

但它应该是这样的:

Not-broken IntelliJ

我尝试手动设置test / src根目录,但它确实不起作用,而且我也不希望其他开发人员必须这样做。

我也尝试使用类似的方法手动设置classpath:

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

但是我无法让它发挥作用(gradle并不喜欢它)。

问题

我只需要解决这两个问题中的一个:

如何手动定义类路径?

OR

如何在使用其gradle刷新按钮时使IntelliJ不会弄乱项目结构?

1 个答案:

答案 0 :(得分:1)

您的IntelliJ遇到srcDirs = ['src/test/java/com/orbitbenefits/keystore']问题,因为src/test/java已经是包含某些来源的文件夹。

一种解决方案可能是定义一个新的文件夹兄弟到src,你有KeystoreDownloader类,然后按如下方式导入密钥库:

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