【问题标题】:Managing multiple Java modules with external resource dependencies管理具有外部资源依赖关系的多个 Java 模块
【发布时间】:2012-09-12 02:36:21
【问题描述】:

假设我有一组 n 个 Java 库,每个库都有一个 conf 和一个资源文件夹,然后我有一个 Java 项目 X,它依赖于其中一些 n 个 Java 库,我该如何制作它以便在构建 X 时,所有依赖的 conf 和 resources 文件夹都被复制并合并到 dist 文件夹中。不 - 我不希望它们被嵌入到罐子中。

显然,重复文件名会出现问题,但我们假设所有文件都有不同的名称。

编辑:一个额外的相关问题:如何让项目 X 在所有依赖项目的开发阶段检测 conf 和资源,而无需将它们复制到项目 X 的​​文件夹中。例如,当我在 X 的 main 方法上单击“运行”时,我希望 Netbeans 能够找到引用的库使用的这些资源。

Edit2:这是一个项目设置的假设示例:

**Library 1:** Image Processing

conf: Processing configurations, log4j
resources: Training sets, etc.

**Library 2:** Machine Learning

conf: Training parameters, log4j
resources: Dependent C++ batch files (i.e. system calls)

**Library 3:** Reporting Tool

resources: Reporting templates

**Library 4:** Text Mining Toolkit

conf: Encoding, character sets, heuristics
resources: Helper PHP scripts

**Executable Project 1: **

Uses Library 1 to process images 
Uses Library 2 to do machine learning on processed images
Uses Library 3 to make reports

**Executable Project 2: **

Uses Library 4 to do text mining
Uses Library 2 to do machine learning on collected textual information
Uses Library 3 to make reports

我们可以假设可执行项目 1 和 2 在部署后可以为其组成库使用不同的参数。

【问题讨论】:

标签: java maven integration


【解决方案1】:

看看maven-dependency-plugin,它可以复制deps并将它们复制到特定位置。

<project>
  [...]
  <build>
    <plugins>
      <plugin>
        <groupId>org.apache.maven.plugins</groupId>
        <artifactId>maven-dependency-plugin</artifactId>
        <version>2.5.1</version>
        <executions>
          <execution>
            <id>copy</id>
            <phase>package</phase>
            <goals>
              <goal>copy</goal>
            </goals>
            <configuration>
              <artifactItems>
                <artifactItem>
                  <groupId>junit</groupId>
                  <artifactId>junit</artifactId>
                  <version>3.8.1</version>
                  <type>jar</type>
                  <overWrite>false</overWrite>
                  <outputDirectory>${project.build.directory}/alternateLocation</outputDirectory>
                  <destFileName>optional-new-name.jar</destFileName>
                </artifactItem>
              </artifactItems>
              <outputDirectory>${project.build.directory}/wars</outputDirectory>
              <overWriteReleases>false</overWriteReleases>
              <overWriteSnapshots>true</overWriteSnapshots>
            </configuration>
          </execution>
        </executions>
      </plugin>
    </plugins>
  </build>
  [...]
</project>

【讨论】:

  • 第二个问题是:我如何告诉 Maven 每个项目都依赖于一个 conf 和一个资源文件夹?为了将它们保留在 jar 之外,我将它们放在项目的根文件夹中。我正在使用 Netbeans 顺便说一句,它没有用于 pom.xml 的漂亮 GUI。 ://
  • 你说的是非 jar 依赖,这意味着有文件夹吗?比这行不通。这些项目是否位于多模块构建中?通常您使用依赖项(二进制类型,例如可以包含属性文件的 jar 文件)。
  • 是的,非 jar 依赖项。不,这些是独立的项目。
  • 比没有好办法。 Maven 不打算做这些事情。
  • 那我该怎么办呢?
【解决方案2】:

我在您的示例中看到以下内容。让我以图书馆 1 为例。

库 1: 图像处理

conf:处理配置,log4j 资源:训练集等。

您的库 1 包含处理配置,在我看来这听起来像是运行时配置。这意味着它应该是创建的 jar 的一部分(src/main/resources 这些东西的位置)。 log4j 配置也是如此。直接放入jar包(项目的src/main/resources即可。

现在进入资源:训练集。如果您创建了一个包含训练集的单独 maven 项目,那么这将生成一个工件,稍后可以将其集成到示例 1 中。如果您有多个训练集,您可以创建不同的工件并将它们用作通常的依赖项或使用 maven-dependency-plugin(或者可能是 maven-remote-resources-plugin)在您的项目中使用它们。

通过此设置,您可以将库 1 部署到本地存储库中,当然也可以部署到存储库管理器中,并将其用作依赖项。

您可以使用相同的方法来处理库 2、3 等。

也许你可以看看maven-remote-resource-plugin(我不确定这是否有帮助)。

【讨论】:

  • 感谢您的回复。一个萦绕在我脑海中的问题是,如果说有几个这样的库,那么这些库中的每一个都必须手动部署。
  • 通常您在发布期间仅通过 maven 部署一次(或者可能通过 mvn deploy 将 SNAPSHOT 版本多次部署到本地存储库中)。还是我错过了什么?
  • 不,我只是在评论库 1-3 必须分别部署到目标文件夹以及也单独部署的可执行项目 1 的问题。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2011-01-12
  • 2021-10-05
  • 2015-10-11
  • 2019-09-03
  • 2013-09-23
  • 2017-04-23
  • 2015-12-28
相关资源
最近更新 更多