首页 > 解决方案 > 使用提供的依赖项构建工件,然后从命令行选择并指定它

问题描述

我有 3 个 Maven 模块:

  1. 数据
  2. 数据开发

核心有一个依赖:

<dependency>
    <groupId>test</groupId>
    <artifactId>data</artifactId>
    <scope>provided</scope>
    <version>1.0-SNAPSHOT</version>
</dependency>

datadata-dev由一个文件组成:test.txt,位于两个模块的test.data包中。(这是第一个问题:构建 2 个名称不同但包结构相同的工件是否是个好主意?)

核心模块像资源一样加载 data.txt 并将字符串从文件输出到 system.out,如下所示:

InputStream is = Thread.currentThread().getContextClassLoader()
    .getResourceAsStream("test/data/data.txt");
if (is == null) {
    System.out.println("No Resource");
    return;
}
BufferedReader br = new BufferedReader(new InputStreamReader(is));
System.out.println(br.readLine());

我的想法是从命令行提供data.jardata-dev.jar以使用一个或另一个版本的data.txt文件运行core.jar 。

但我找不到有效的解决方案。实现这个想法并从命令行运行 jar 文件的正确方法是什么?

标签: javamavenjarclasspath

解决方案


在您的情况下,我认为提供静态资源作为可运行 jar 的类路径依赖项没有任何价值。只需将文件名作为命令行参数传递。因此,您可以将其运行为:

java -jar core.jar -Ddata=data.txt

或作为:

java -jar core.jar -Ddata=data-dev.txt

根据环境,然后执行:

String filename = System.getProperty("data");
InputStream is = new FileInputStream(filename);
BufferedReader br = new BufferedReader(new InputStreamReader(is));
System.out.println(br.readLine());

如果您真的希望将这些数据打包到一个 jar 文件中,那么您也可以在运行时使用java.util.jar API解压它。


推荐阅读