避免在Maven中重复

时间:2014-06-16 16:35:11

标签: maven

我有一个带有一些配置文件的pom。对于其中一个配置文件,我想添加一个服务器端测试代码模块,用于在一些javascript集成测试中查询数据库。

我不希望这个代码发布,因为它会膨胀,也可能会引入一些安全问题。

我们目前的设置是基本上有2个主要配置文件,指定自己的不同模块列表以及相当长的属性列表。然后我们还有一个缩小配置文件,可以运行某些版本。

这可以通过使用-P标志并提供多个来实现:例如-P firstMainProfile,Minification

新配置文件只需添加一个模块,但取决于其他一些模块和一些属性。我希望我能够做到这一点:

    <profile>
        <id>Test</id>
        <modules>
            <module>TestCode</module>
        </modules>
    </profile>

然后在具有它所依赖的模块的那个之后运行它。例如

-P firstMainProfile,Test,Minification

然而,这不起作用。当它试图构建它时抱怨无法找到依赖项。

我可以复制整个配置文件并添加这个额外的模块,但这会让我头疼并且因为它的接受/集成我希望它的设置方式与另一个完全相同。

请帮忙!我可以使用配置文件来完成这项工作吗?我是否需要对子pom执行某些操作来列出依赖项?它目前看起来像这样:

<parent>
    <artifactId>artifact</artifactId>
    <groupId>something</groupId>
    <version>1.0</version>
</parent>
<modelVersion>4.0.0</modelVersion>

<artifactId>TestCode</artifactId>

更新

我认为我已经解决了这个问题,但实际上我所做的就是将问题进一步推进。该项目有一个网络模块,据我所知它基本上就是说什么进入战争文件。我的新模块没有进入那里,直到我将其添加为该项目的依赖项。然而,现在新模块已经构建并发布,即使我没有明确地构建它对我没有意义,而且与我想要的相反。

当它构建时它似乎存储在我的m2目录中,即使我没有构建它也会从那里拉出来。

所以现在看来​​我需要复制web项目来改变部署的内容?有没有办法让依赖条件有条件避免必须这样做?

2 个答案:

答案 0 :(得分:1)

需要做很长时间的一系列步骤。

在新模块中添加对其他模块的依赖

我认为当我将导入添加到另一个项目中的类时,我认为IDEA会解决项目的依赖关系。

我需要将它添加到我的新pom中:

<dependencies>
    <dependency>
        <groupId>group</groupId>
        <artifactId>myOtherProject</artifactId>
    </dependency>
</dependencies>

将关于依赖关系的元信息添加到父pom

我还需要在依赖关系管理中的父pom中添加一个依赖关系,该关系管理定义了其他的版本。

添加&#39;依赖&#39;部署项目

然后我还需要为特定配置文件激活的webapp / war部署pom添加依赖项(这似乎是在maven中具有条件性的唯一方法吗?)。

避免重复

值得庆幸的是,似乎依赖列表是附加的,所以如果你做这样的事情:

<dependencies>
    a
    b
    c
</dependencies>

<profiles>
    <profile>
        <id>Test</id>

            <dependencies>
                d
            </dependencies>
    </profile>
</profiles>

如果您使用个人资料&#39; test&#39;那么您最终会得到依赖关系a,b,c,d。因此,您不必复制粘贴整批并定义2个配置文件以添加一个依赖项。

当你在maven中使用其他列表时,我也会出现相同的加法原则。

我正在合并基本的模块集(来自1个配置文件)和我的测试版,它似乎找出了正确的构建顺序。

我的新个人资料看起来像这样。

    <profile>
        <id>Test</id>

        <modules>
            <module>TestCode</module>
        </modules>

        <properties>
            <environment>test</environment>
        </properties>
    </profile>

所以我只是指定差异(只要它们是相加的!)。

花了很长时间才弄清楚,但即使不清楚发生了什么,我也对这个解决方案感到满意。

答案 1 :(得分:0)

我对您的问题没有清楚的了解但我认为您不希望在Test模块中复制<dependencies>标记,因为它与您的firstMainProfile模块的<dependencies>非常相似标签?如果这是正确的,你应该import dependencies

  

上一节中的示例描述了如何通过继承来指定托管依赖项。但是,在较大的项目中,可能无法实现此目标,因为项目只能从单个父项继承。为了适应这种情况,项目可以从其他项目导入托管依赖项。这是通过将pom工件声明为具有“import”范围的依赖项来实现的。

<project>
  <modelVersion>4.0.0</modelVersion>
  <groupId>maven</groupId>
  <artifactId>B</artifactId>
  <packaging>pom</packaging>
  <name>B</name>
  <version>1.0</version>
  <dependencyManagement>
    <dependencies>
      <dependency>
        <groupId>maven</groupId>
        <artifactId>A</artifactId>
        <version>1.0</version>
        <type>pom</type>
        <scope>import</scope>
      </dependency>
      <dependency>
        <groupId>test</groupId>
        <artifactId>d</artifactId>
        <version>1.0</version>
      </dependency>
    </dependencies>
  </dependencyManagement>
  <dependencies>
    <dependency>
      <groupId>test</groupId>
      <artifactId>a</artifactId>
      <version>1.0</version>
      <scope>runtime</scope>
    </dependency>
    <dependency>
      <groupId>test</groupId>
      <artifactId>c</artifactId>
      <scope>runtime</scope>
    </dependency>
  </dependencies>
</project>
  

假设A是前面例子中定义的pom,最终结果将是相同的。除了d之外,所有A的托管依赖项都将被合并到B中,因为它是在这个pom中定义的。

运行这个想法,让您的Test模块成为firstMainProfile模块的子项可能更直接。这样它就会自动获得这些依赖关系,你不必费心去导入。