2010-09-21 3 views
1

Я пытаюсь написать сборку maven, и я не уверен, как продолжить. Это довольно сложно, поэтому примеры, на которые я google, действительно не помогают. Это то, что я пытаюсь сделать:Сложная сборка Maven

  • Создайте установочный файл с помощью launch4j. Эта часть работает, предполагая, что файл jar правильно собран (следовательно, требуется сборка maven.)
  • Программа установки содержит некоторые зависимости. Они собраны (в настоящее время), используя jar-with-dependenciesdescriptorRef. Это тоже работает.
  • Мне нужно включить военный файл (из другого проекта) в большую банку. Это мое замешательство.

Как создать assembly.xml, что будет делать как банку с зависимостями (распаковка всех этих файлов .jar) и включает в себя военный файл из другого проекта (который не является распакован).

Любая помощь будет оценена по достоинству.

+0

Вы хотите все в большой файл Jar? Вы посмотрели на Убер-Джара? – Thomas

ответ

2

Как создать файл assembly.xml, который будет делать как jar с зависимостями (распаковывать все эти файлы jar), так и включать военный файл из другого проекта (который не распакован).

Предполагая, что у вас есть структура проекта, подобный приведенному ниже (я предполагаю простую структуру, так как вы ничего конкретного не говоря уже об этом):

 
. 
├── pom.xml 
└── src 
    ├── main 
    │   ├── assembly 
    │   │   └── uberjar.xml 
    │   └── java 
    │    └── com 
    │     └── stackoverflow 
    │      └── App.java 
    └── test 
     └── java 
      └── com 
       └── stackoverflow 
        └── AppTest.java 

Со следующим pom.xml :

<project> 
    <modelVersion>4.0.0</modelVersion> 
    <groupId>com.stackoverflow</groupId> 
    <artifactId>Q3762049</artifactId> 
    <version>1.0-SNAPSHOT</version> 
    <dependencies> 
    <!-- this is the war we want to include in the assembly --> 
    <dependency> 
     <groupId>com.mycompany</groupId> 
     <artifactId>my-webapp</artifactId> 
     <version>1.0-SNAPSHOT</version> 
     <type>war</type> 
     <scope>runtime</scope> 
    </dependency> 
    <!-- and below, the other dependencies --> 
    <dependency> 
     <groupId>commons-lang</groupId> 
     <artifactId>commons-lang</artifactId> 
     <version>2.4</version> 
    </dependency> 
    ... 
    </dependencies> 
    <build> 
    <plugins> 
     <plugin> 
     <artifactId>maven-assembly-plugin</artifactId> 
     <version>2.2-beta-5</version> 
     <configuration> 
      <descriptors> 
      <descriptor>src/main/assembly/uberjar.xml</descriptor> 
      </descriptors> 
     </configuration> 
     <executions> 
      <execution> 
      <id>make-assembly</id> 
      <phase>package</phase> 
      <goals> 
       <goal>single</goal> 
      </goals> 
      </execution> 
     </executions> 
     </plugin> 
    </plugins> 
    </build> 
</project> 

Как вы можете видеть,

  1. Мы не идут чтобы использовать предопределенный дескриптор jar-with-dependencies здесь, мы собираемся его повторно использовать в нашем собственном дескрипторе сборки.
  2. У нас есть зависимость, заявленная в войне с областью runtime, чтобы мы могли включить ее в сборку.

И теперь, обычай uberjar.xml:

<assembly xmlns="http://maven.apache.org/plugins/maven-assembly-plugin/assembly/1.1.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/plugins/maven-assembly-plugin/assembly/1.1.0 http://maven.apache.org/xsd/assembly-1.1.0.xsd"> 
    <id>uberjar</id> 
    <formats> 
    <format>jar</format> 
    </formats> 
    <includeBaseDirectory>false</includeBaseDirectory> 
    <dependencySets> 
    <dependencySet> 
     <unpack>true</unpack> 
     <scope>runtime</scope> 
     <useProjectArtifact>false</useProjectArtifact> 
     <excludes> 
     <exclude>*:war</exclude> 
     </excludes> 
    </dependencySet> 
    <dependencySet> 
     <unpack>false</unpack> 
     <scope>runtime</scope> 
     <useProjectArtifact>false</useProjectArtifact> 
     <includes> 
     <include>*:war</include> 
     </includes> 
    </dependencySet> 
    </dependencySets> 
    <fileSets> 
    <fileSet> 
     <directory>${project.build.outputDirectory}</directory> 
     <outputDirectory>/</outputDirectory> 
    </fileSet> 
    </fileSets> 
</assembly> 

Это незначительное изменение jar-with-dependencies дескриптора, который создаст банку:

  • зависимостей, кроме войны, распаковал
  • Война webapp, не распакована
  • классы от проекта i tself

Как показано ниже:

 
$ mvn clean package 
[INFO] Scanning for projects... 
... 
$ cd target; jar xvf Q3762049-1.0-SNAPSHOT-uberjar.jar 
    created: META-INF/ 
inflated: META-INF/MANIFEST.MF 
    created: org/ 
    created: org/apache/ 
    created: org/apache/commons/ 
    created: org/apache/commons/lang/ 
    created: org/apache/commons/lang/builder/ 
    created: org/apache/commons/lang/enum/ 
    created: org/apache/commons/lang/enums/ 
    created: org/apache/commons/lang/exception/ 
    created: org/apache/commons/lang/math/ 
    created: org/apache/commons/lang/mutable/ 
    created: org/apache/commons/lang/text/ 
    created: org/apache/commons/lang/time/ 
inflated: META-INF/LICENSE.txt 
inflated: META-INF/NOTICE.txt 
inflated: org/apache/commons/lang/ArrayUtils.class 
... 
    created: META-INF/maven/ 
    created: META-INF/maven/commons-lang/ 
    created: META-INF/maven/commons-lang/commons-lang/ 
inflated: META-INF/maven/commons-lang/commons-lang/pom.xml 
inflated: META-INF/maven/commons-lang/commons-lang/pom.properties 
inflated: my-webapp-1.0-SNAPSHOT.war 
    created: com/ 
    created: com/stackoverflow/ 
inflated: com/stackoverflow/App.class