管理具有外部资源依赖关系的多个Java模块

管理具有外部资源依赖关系的多个Java模块,java,maven,integration,Java,Maven,Integration,假设我有一组n个Java库,每个库都有一个conf和一个resources文件夹,然后我有一个Java项目X,它依赖于这些n个Java库中的一些,我如何使它在构建X时,所有依赖的conf和resources文件夹都被复制并合并到dist文件夹中。不,我不想把它们埋在罐子里 显然,重复的文件名会有问题,但让我们假设所有文件都有不同的名称 编辑:另一个相关问题:如何使ProjectX能够在开发阶段检测所有依赖项目的配置和资源,而无需将它们复制到ProjectX的文件夹中。例如,我希望Netbeans

假设我有一组n个Java库,每个库都有一个conf和一个resources文件夹,然后我有一个Java项目X,它依赖于这些n个Java库中的一些,我如何使它在构建X时,所有依赖的conf和resources文件夹都被复制并合并到dist文件夹中。不,我不想把它们埋在罐子里

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

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

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在部署后可以为它们的组成库使用不同的参数。

看看可以复制DEP并将它们复制到特定位置的

<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>
看一下可以复制DEP并将其复制到特定位置的

<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>

我在你的例子中看到了以下内容。让我以库1为例

库1:图像处理

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

您有库1,其中包含处理配置,在我看来,这类似于运行时配置。这意味着它应该是创建的jar src/main/resources的一部分,也就是这些东西的位置。log4j配置也是如此。只需将其放入项目的jarsrc/main/resources中

现在提交到资源:培训集。如果您创建一个单独的maven项目,其中包含一个训练集,那么这将生成一个工件,并且可以稍后用于将其集成到示例1中。如果您有多个培训集,您可以创建不同的工件,并将其作为常规依赖项使用,或者使用maven依赖项插件,或者可能是maven远程资源插件,以便在您的项目中使用它们

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

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


也许你可以看看,我不确定这是否有用。

我在你的例子中看到了以下内容。让我以库1为例

库1:图像处理

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

您有库1,其中包含处理配置,在我看来,这类似于运行时配置。这意味着它应该是创建的jar src/main/resources的一部分,也就是这些东西的位置。log4j配置也是如此。只需将其放入项目的jarsrc/main/resources中

现在提交到资源:培训集。如果您创建一个单独的maven项目,其中包含一个训练集,那么这将生成一个工件,并且可以稍后用于将其集成到示例1中。如果您有多个培训集,您可以创建不同的工件,并将其作为常规依赖项使用,或者使用maven依赖项插件,或者可能是maven远程资源插件,以便在您的项目中使用它们

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

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


也许你可以看看我不确定这是否有帮助。

第二个问题是:如何告诉Maven每个项目都依赖于一个conf和一个资源文件夹?为了将它们保存在jar外部,我将它们放在项目的根文件夹中。顺便说一句,我使用的是Netbeans,它没有用于pom.xml的漂亮GUI:/您是在谈论非jar依赖关系,这意味着有文件夹吗?否则这就行不通了。这些项目是否位于多模块构建中?通常,您使用的依赖项有点像jar文件,它可以包含一个属性文件。是的,非jar依赖项。不,这些都是独立的项目。没有好的方法可以做到这一点。Maven不打算做这样的事情。那么我应该怎么做呢?第二个问题是:我如何告诉Maven每个项目都依赖于一个conf和一个资源文件夹?为了将它们保存在jar外部,我将它们放在项目的根文件夹中。顺便说一句,我使用的是Netbeans,它没有用于pom.xml的漂亮GUI:/您是在谈论非jar依赖关系,这意味着有文件夹吗?否则这就行不通了。这些项目是否位于多模块构建中?通常,您使用的依赖项有点像jar文件,它可以包含一个属性文件。是的,非jar依赖项。不,这些都是独立的项目。没有好的方法可以做到这一点。马文无意做这样的事
s、 那我该怎么做呢?谢谢你的回复。一个萦绕在我脑海中的问题是,如果说有几个这样的库,那么每个库都必须手动部署。通常,在发布期间,您只能通过maven部署一次,或者通过mvn部署几次,将快照版本部署到本地存储库中。还是我遗漏了什么?不,我只是在评论库1-3必须与可执行项目1一起单独部署到目标文件夹的问题。可执行项目1也是单独部署的。感谢您的回复。一个萦绕在我脑海中的问题是,如果说有几个这样的库,那么每个库都必须手动部署。通常,在发布期间,您只能通过maven部署一次,或者通过mvn部署几次,将快照版本部署到本地存储库中。还是我遗漏了什么?不,我只是在评论库1-3必须与可执行项目1一起单独部署到目标文件夹的问题,可执行项目1也是单独部署的。与execellent Khmarbaise answer一样,我推荐他指出的方法。看看这里,这是完全相同的需求:就像execellent Khmarbaise的回答一样,我会推荐他指出的方式。看看这里,这是完全相同的需求: