maven - 将一些资源分成带有不同分类器的jar

时间:2011-10-04 14:30:19

标签: java maven

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

这一切都很好,除了模型非常大,API的一些用户可能根本不需要模型。 (他们只需要Java类和其他较小的资源文件。)所以我想安排一个用户可以选择包含模型文件的发行版。

起初我认为模型应该是他们自己的独立Maven项目,但是如果我把它们拉出来,我不确定依赖项是如何工作的。模型项目必须依赖于Java API的主项目,但主项目必须依赖于模型项目进行测试。所以这似乎是循环的。

然后我想也许我应该尝试用分类器创建一个单独的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 个答案:

答案 0 :(得分:2)

鉴于这些要点......

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

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

我建议您执行以下操作:

  • 为您最初倾向于为模型创建单独的maven模块。它们将位于新模块的src/main/resources中。您的API模块将不再包含src/main/resources
  • 中的模型
  • 在API模块中,创建一些仅用于单元测试的简单模型,并将它们放在src/test/resources中。尽可能简化它们以测试API功能。重新编写API单元测试以使用它们。作为起点,您可以制作可交付模型的副本并将它们放在此处,但我建议使用一组较小的测试数据,其中包含模型可以包含的各种事物的示例。
  • 如果您想测试您是否正确编写了预先构建的模型,请让新模型模块依赖于API模块,并为模型模块中的预构建模型编写单元测试。

这使您无需模块循环,与API分离的模型,API的单元测试以及可交付模型的可选单元测试。