【问题标题】:How to pass a filepath from Gradle to Java class?如何将文件路径从 Gradle 传递到 Java 类?
【发布时间】:2019-03-15 09:24:15
【问题描述】:

所以我想做的是使用 Gradle 运行我的 Java 应用程序,但还将 .csv 和 .xml 文件路径传递给我的主类,以便在我的 bufferedReader 中使用它们,我不知道应该如何完成。我的应用程序不是构建到 jar 的,它应该使用 gradle run 任务运行。我希望用户能够指定要使用的自己的 xml 和 csv 文件(在命令行中),然后运行 ​​Java 应用程序,而不是询问应用程序内文件的路径。因此,例如让我们采用这行代码: Reader reader = Files.newBufferedReader(Paths.get("Here is the place I want gradle to include the path to csv"));

【问题讨论】:

  • 如果你的应用程序是用普通的旧 jar 构建的,你可以通过命令行参数传递。不知道它是否与gradle有关。
  • 我稍微调整了一下我的问题。
  • 这可能会有所帮助:stackoverflow.com/questions/27604283/…

标签: java gradle


【解决方案1】:
// sample gradle task to execute a java jar
task runFromGradle() {
    print("java -jar myJar.jar path/to/some.csv".execute().text)
}

// some sample class with a main that accepts args. first arg is the csv path
class Scratch {
    public static void main(String[] args) {
        String csvPath = args[0];
        Reader reader = Files.newBufferedReader(Paths.get(csvPath));
        // do whatever with reader...
    }
}

# from command line
$ gradle runFromGradle

对于@lance-java 的评论,当然还有其他方法可以完成相同的任务。他提到了另一个可以扩展的JavaExec 任务。如果您希望使用该路径,这里是一个示例。

// note the `JavaExec` task is only available from the java plugin,
// this may or may not what your app needs
// reference: https://docs.gradle.org/current/javadoc/org/gradle/api/tasks/JavaExec.html
apply plugin: 'java'

task runFromGradle(type: JavaExec) {
  // here gradle has access to the raw sourcesets
  // so we can directly use them for the runtime
  classpath = sourceSets.main.runtimeClasspath

  main = 'com.me.Main'

  // arguments to pass to the application
  args 'path/to/some.csv'
}

# from command line
$ gradle runFromGradle

# java class is the same

【讨论】:

  • 非常感谢,原来如此!原来我缺乏一些基本的 Java 知识,因为这是有史以来第一次,我将使用 main 方法参数,但我无法弄清楚 'args' 在 gradle 中是如何工作的
  • GString(gradle 的字符串)能够作为 shell 进程执行,从而使参数与命令行中的参数完全相同。如果您想阅读 gradle 的字符串扩展,很高兴在这里提供另一个参考资料:docs.groovy-lang.org/latest/html/groovy-jdk/java/lang/… 更多关于 java args:docs.oracle.com/javase/tutorial/essential/environment/…Good Luck!
  • 这绝对不是推荐的做法!!请看JavaExec任务
  • 更新为包含JavaExec 的示例。唯一的问题是来自java 插件,它可能与其他插件冲突,具体取决于项目。 OP 没有指定 gradle 仅用于 java。第一个答案在所有插件之间更灵活,但如果他们使用java 插件,那么您的正确答案是肯定的JavaExec 是显而易见的答案。
  • 你的第一个任务太糟糕了!它在 Gradle 的配置阶段而不是执行阶段运行该过程,因此它将为每个构建运行(无论用户指定了哪些任务)。 JavaExec 不需要将 java 插件应用到项目中
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-10-06
  • 2011-04-18
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多