有 Java 编程相关的问题?

你可以在下面搜索框中键入要查询的问题!

JavaMaven使用不同的分类器将一些资源分离到一个jar中

我有一个项目,其中包括一些Java API、一些资源文件和一些可以被Java API使用的预构建机器学习模型。模型当前在src/main/resources中,类通过Class.getResource加载它们。这些模型用于几个单元测试,以确保API按预期工作

这基本上没问题,只是模型非常大,一些API用户可能根本不需要模型。(他们只需要Java类和其他较小的资源文件。)所以我想安排一个发行版,用户可以选择是否包含模型文件

起初,我认为这些模型可能应该是一个独立的Maven项目,但如果我把它们取出来,我不确定依赖项会如何工作。models项目必须依赖于JavaAPI的主项目,但主项目必须依赖于models项目进行测试。所以这似乎是循环的

然后我想也许我应该尝试创建一个带有分类器的独立jar,这样,例如,只需要API的用户就可以编写:

<dependency>
    <groupId>foo</groupId>
    <artifactId>bar</artifactId>
    <version>0.5.0</version>
</dependency>

想要API和模型的用户会写:

<dependency>
    <groupId>foo</groupId>
    <artifactId>bar</artifactId>
    <version>0.5.0</version>
</dependency>
<dependency>
    <groupId>foo</groupId>
    <artifactId>bar</artifactId>
    <version>0.5.0</version>
    <classifier>models</classifier>
</dependency>

但我不知道如何设置,以便在运行mvn package时,将一些资源分离到一个具有不同分类器的jar中。我该怎么做

(理想情况下,这一切都只需要基本的mvn package就可以实现,并且不需要用不同的配置文件来进行调整,因为我总是用相同的方式来包装东西。)


共 (1) 个答案

  1. # 1 楼答案

    鉴于这些观点

    • 您希望您的API和预构建模型是可单独交付的工件
    • 理论上,API的用户可以提供自己的模型
    • 您可以使用预先构建的可交付模型来测试API

    我认为问题在于,您正在使用可交付模型进行单元测试

    我建议您执行以下操作:

    • 按照最初的想法,为模型创建一个单独的maven模块。它们将位于新模块的src/main/resources。API模块将不再在src/main/resources中有模型
    • 在API模块中,创建一些仅为单元测试设计的简单模型,并将它们放在src/test/resources中。让他们尽可能少地测试API功能。重新编写API单元测试以使用它们。作为一个起点,你可以制作一份可交付模型的副本,并将它们放在这里,但我建议使用一组较小的测试数据,其中包含模型可以包含的每种类型的示例
    • 如果您想测试您是否正确编写了预构建模型,请让新模型模块依赖于API模块,并在模型模块中为预构建模型编写单元测试

    这就不需要模块周期、与API分离的模型、API的单元测试,以及可选的可交付模型的单元测试