当前位置: 首页 > 知识库问答 >
问题:

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

步衡
2023-03-14

我正在尝试运行一个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

因此,我在我的任务中添加了一个类路径,如问题中所述:

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

然而,这是一个大型的遗留项目,具有非常长的类路径,所以当我运行< code > gradle download keystore 时,我得到了另一个错误:

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.gradlehtml" target="_blank">修改了我的source ceSets,现在看起来像这样:

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刷新时,它通常会破坏项目。它看起来像这样:

但它应该是这样的:

我尝试过手动设置test/src根目录,但它并不真的工作,我也不希望其他开发人员不得不这样做。

我还尝试过使用以下方式手动设置类路径:

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

但我无法让它工作(格拉德尔不喜欢它)。

问题

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

如何手动定义类路径?

我怎样才能让IntelliJ在使用它的gradle refresh按钮时不弄乱项目结构?

共有1个答案

欧阳安阳
2023-03-14

您的IntelliJ遇到了srcDir=['src/test/java/com/orbit收益/keystore']的问题,因为src/test/java已经是一个包含一些源的文件夹。

一种解决方案可能是为src定义一个新的文件夹兄弟,其中您有Keystore Downloader类,然后导入keystore,如下所示:

keystore {
    java {
        srcDirs = ['keystore']
    }
}
 类似资料:
  • 我试图在PySpark中运行一个自定义的HDFS阅读器类。这个类是用Java编写的,我需要从PySpark访问它,可以从shell访问,也可以使用spark-submit访问。 有人能帮忙吗?谢了。

  • 我在一个项目中,目前构建了26个JAR(+6如果我们算上仅测试的JAR)。出于性能原因,我们希望将它们全部组合到单个可执行文件中。这是在windows机器上,具有graalvm-ce-java11-20.0.0。我们在用IntelliJ和Gradle。我现在只是想出一个命令行,在我尝试在Gradle中复制它之前,它甚至可以工作一点点。Gradle还不在图片中,因此缺少适当的标记。 我想尽了一切办法

  • 问题内容: 因此,我可以很好地做到这一点: 如果存在。我也可以高兴地做到这一点: 如果类文件存在于jar的适当部分中。简单的东西。但是我无法为自己的生活做这样的事情: 存在的地方和存在的地方(当然不包含MyClass)。 我会感到愚蠢吗? 问题答案: 可能:) 基本上,这只是在类路径和jar文件中包括(当前目录)。

  • 我有一个build.gradle文件,比如: 当我使用STS Gradle插件将项目导入Eclipse时,只有compile conf依赖项显示在“Gradle dependencies”类路径容器下。 是否也有可能让提供的conf被STS插件拉入?

  • 我想写一个Gradle任务,在我所有的子项目中共享。此任务在调用它的子项目中查找所有其他类型为“GenerateMavenPom”的任务,并执行这些任务。 通过这样做,我的子项目可以定义他们想要的任何Maven发布,我可以使用“gradle GenerateMavenPomFiles”等单个任务执行gradle来创建pom.xml,而不需要知道每个子项目中的单个发布类型。为什么?因为Maven插件

  • 但不走运,未设置自定义运行时类路径。