2015-09-19 38 views
2

我有一个原始的java web应用程序(因此产生一个WAR文件),这是一个Maven管理的,我们称之为webapp如何将Maven工件用作另一个工件(或模块)的输入?

我喜欢保持其Maven配置原样,但有时我需要通过操纵其内容(或者对其应用通用操作)产生WAR的后期制作。

所以我做了一个多模块项目:

- multimodule 
    +-- webapp 
    +-- operator 

operator可以做几件事情。例如,它调用一个(JAVA)命令行程序来对WAR进行一些检查:如何获取'webapp'模块输出(即WAR文件)并将其设置为operator模块的输入?

我不知道如何做到这一点,也没有在网上搜索什么,所以我卡住了。

回答

1

您需要将webapp作为operator项目的依赖项。的operator

样品POM:

<?xml version="1.0" encoding="UTF-8"?> 
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" 
    xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd"> 

    <modelVersion>4.0.0</modelVersion> 
    <packaging>jar</packaging> 
    <version>0.0.1-SNAPSHOT</version> 
    <groupId>my-groupid</groupId> 
    <artifactId>operator</artifactId> 
    <dependencies> 
     <dependency> 
      <groupId>my-groupid</groupId> 
      <artifactId>webapp</artifactId> 
      <version>${project.version}</version> 
      <type>war</type> 
     </dependency> 
    </dependencies> 
</project> 

通过创建一个显式依赖,Maven会构建WebApp在反应器中operator项目之前,你就可以进行后期处理那场战争。

让我们举一个例子,考虑你想调用一个以这场战争为参数的程序。

首先,这个新的依赖关系必须被复制到一个特定的位置。这是通过maven-dependency-plugin完成的。这个插件的目标是copy-dependencies,它用于将项目的所有直接依赖关系复制到文件系统中的某个位置。示例配置为:

<plugin> 
    <artifactId>maven-dependency-plugin</artifactId> 
    <version>2.10</version> 
    <executions> 
     <execution> 
      <id>copy-dependencies</id> 
      <phase>package</phase> 
      <goals> 
       <goal>copy-dependencies</goal> 
      </goals> 
      <configuration> 
       <outputDirectory>${project.build.directory}/libs</outputDirectory> 
      </configuration> 
     </execution> 
    </executions> 
<plugin> 

现在依赖可在文件系统中,您可以运行使用exec-maven-plugin的程序。示例配置,推出operator -param1 webapp.war

<plugin> 
    <groupId>org.codehaus.mojo</groupId> 
    <artifactId>exec-maven-plugin</artifactId> 
    <version>1.4.0</version> 
    <executions> 
     <execution> 
      <goals> 
       <goal>exec</goal> 
      </goals> 
     </execution> 
     <configuration> 
      <executable>operator</executable> 
      <workingDirectory>${project.build.directory}/libs</workingDirectory> 
      <arguments> 
       <argument>-param1</argument> 
       <argument>webapp.war</argument> 
      </arguments> 
     </configuration> 
    </executions> 
</plugin> 
+0

是的,谢谢。但是,我的疑惑出现在这里:我怎么继续?例如,假设'operator'是一个应该像这样调用的程序:'operator -param1 webapp.war',我应该在'operator' POM中做些什么? – watery

+0

@watery我用一个例子编辑了我的答案 – Tunaki

+0

很好!还有一件事:因为'webapp.war'是由一个依赖项构成的,我可以通过一个属性或其他动态的方式来获取它,这样我就不必每次修改''文本,例如,依赖版本? – watery

0

看看maven profiles

您应该能够定义两个配置文件并配置第二个配置文件来执行其他操作。如果你遵循这种方法,你将不需要两个模块。

+0

其实,我的设置是有一点不同:我的主要目标是两个类似的WAR传递给外部程序(我在这里简单),因此一个模块为他们每个人是必须的;另外,我想让每个WAR构建配置与附加和可变操作分开,所以我认为配置文件不适合这里。 – watery

相关问题