使用提供的依赖项构建工件,然后从命令行中选择并指定它

时间:2018-04-28 04:33:44

标签: java maven jar classpath

我有3个maven模块:

  1. 核心
  2. 数据
  3. 数据-dev的
  4. core 具有依赖关系:

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

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

      data 里面的
    • data.txt 有一个简单的字符串“hello world”。
    • data-dev 中的
    • data.txt 有一个不同的字符串“hello dev”。

    core 模块像资源一样加载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.jar data-dev.jar 来运行 core.jar 另一个版本的 data.txt 文件。

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

1 个答案:

答案 0 :(得分:0)

我认为在您的情况下提供静态资源作为runnable 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将其解压缩。