使用自定义类路径在 Gradle 任务中运行 Java 类

Posted

技术标签:

【中文标题】使用自定义类路径在 Gradle 任务中运行 Java 类【英文标题】:Running Java class in Gradle task with custom classpath 【发布时间】:2016-11-11 12:02:59 【问题描述】:

我正在尝试将 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

所以我在build.gradle 中修改了我的sourceSets,所以它现在看起来像这样:

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('src/test/java/com/orbitbenefits/keystore')

但我无法让它工作(gradle 不喜欢它)。

问题

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

如何手动定义类路径?

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

【问题讨论】:

【参考方案1】:

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

一种解决方案可能是为 src 定义一个新的同级文件夹,其中您有 KeystoreDownloader 类,然后按如下方式导入密钥库:

keystore 
    java 
        srcDirs = ['keystore']
    

【讨论】:

以上是关于使用自定义类路径在 Gradle 任务中运行 Java 类的主要内容,如果未能解决你的问题,请参考以下文章

如何在 Gradle 中定义编译时 *only* 类路径?

Android Gradle 插件自定义 Gradle 任务 ⑩ ( 自定义任务类继承 DefaultTask 类 | TaskContainer#create 函数创建任务 | 生成自定义任务)

Android Gradle 插件自定义 Gradle 任务 ⑩ ( 自定义任务类继承 DefaultTask 类 | TaskContainer#create 函数创建任务 | 生成自定义任务)

使生成代码的自定义 Gradle 任务在 IDE 导入时运行

制作自定义Gradle任务,生成代码,在IDE导入上运行

每个变体的 Android Gradle 自定义任务