Из соображений производительности мне нужно создать новый артефакт EAR рядом с архивом WAR без использования нескольких модулей projekt . EAR будет содержать WAR (в подкаталоге /web) и статический файл application.xml.

Все, что мне нужно генерировать нестатическим способом, это Java-классы и файлы дескрипторов Maven (META-INF/maven/${groupId}/${artifactId}/pom.xml и META-INF/maven/${groupId}/${artifactId}/pom.properties).

С классами нет ничего сложного, но как сгенерировать и прикрепить файлы дескриптора Maven к новому EAR?

Это хорошо работает, но файлы дескриптора Maven не создаются внутри архива EAR.

...
<packaging>war</packaging>
...
<properties>
  <compile.dir>${project.build.directory}/${project.build.finalName}</compile.dir>
  <ear.zip>${project.build.directory}/my-archive.ear</ear.zip>
</properties>
...
<plugins>
  <plugin>
    <groupId>org.apache.maven.plugins</groupId>
    <artifactId>maven-antrun-plugin</artifactId>
    <executions>
      <execution>
        <id>create-EAR-archive</id>
        <phase>prepare-package</phase>
        <goals>
            <goal>run</goal>
        </goals>
        <configuration>
            <target>
              <!-- copy webapp files -->
              <copy todir="${compile.dir}/web">
                  <fileset dir="src/main/webapp" />
              </copy>
              <!-- copy classes -->
              <copy todir="${compile.dir}/web/WEB-INF/classes">
                  <fileset dir="${project.build.directory}/classes" />
              </copy>
              <!-- copy application.xml -->
              <copy todir="${compile.dir}">
                  <fileset dir="src/main/resources" includes="META-INF/application.xml" />
              </copy>
              <!-- copy some big files -->
              ...
              <!-- zip EAR -->
              <zip destfile="${ear.zip}" basedir="${compile.dir}" />
            </target>
         </configuration>
      </execution>
    </executions>
  </plugin>
  <plugin>
    <groupId>org.codehaus.mojo</groupId>
    <artifactId>build-helper-maven-plugin</artifactId>
    <version>1.10</version>
    <executions>
        <execution>
            <id>attach-EAR-artifact</id>
            <goals>
                <goal>attach-artifact</goal>
            </goals>
            <phase>package</phase>
            <configuration>
                <artifacts>
                    <artifact>
                        <file>${ear.zip}</file>
                        <type>ear</type>
                        <classifier>exploded</classifier>
                    </artifact>                                
                </artifacts>
                <archive>
                  <addMavenDescriptor>true</addMavenDescriptor>
                </archive>
            </configuration>
        </execution>
      </executions>
  </plugin>
</plugins>
0
ttulka 3 Апр 2017 в 15:52

2 ответа

Лучший ответ

Решение состоит в том, чтобы переместить фазу военного пакета в другую фазу перед фазой подготовки пакета, тогда есть полный архив WAR, содержащий файлы дескриптора maven. Таким образом, все данные готовы, когда архив EAR подготовлен.

<plugin>
    <groupId>org.apache.maven.plugins</groupId>
    <artifactId>maven-war-plugin</artifactId>
    <executions>
        <execution>
        <phase>process-classes</phase>
        <goals>
            <goal>war</goal>
        </goals>
        </execution>
    </executions>                    
</plugin>

Архив распакуйте и используйте на этапе подготовки пакета, как и прежде:

<!-- unzip the war -->
<unzip src="${project.build.directory}/${project.build.finalName}.war" dest="${project.build.directory}/war-exploded" />                                

<!-- move the war content -->
<move todir="${compile.dir}/web">
    <fileset dir="${project.build.directory}/war-exploded" />
</move> 
0
ttulka 6 Апр 2017 в 08:03

Проще всего иметь многомодульный проект.

Родитель, как:

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

  <groupId>com.greg</groupId>
  <artifactId>ear-example</artifactId>
  <version>1.0-SNAPSHOT</version>
  <packaging>pom</packaging>

  <properties>
        <myproject.version>1.0-SNAPSHOT</myproject.version>
  </properties>

  <name>ear-example</name>
  <modules>
    <module>example-ear</module>
    <module>example-war</module>
  </modules>

</project>

Война, как у вас, и проект на ухо:

<project xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd" xmlns="http://maven.apache.org/POM/4.0.0"
    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
  <modelVersion>4.0.0</modelVersion>

  <parent>
    <groupId>com.greg</groupId>
    <artifactId>ear-example</artifactId>
    <version>1.0-SNAPSHOT</version>
  </parent>

  <artifactId>example-ear</artifactId>
  <packaging>ear</packaging>

  <dependencies>
    <dependency>
      <groupId>com.greg</groupId>
      <artifactId>example-jar</artifactId>
      <version>${project.version}</version>
    </dependency>
  </dependencies>

  <build>
   <plugins>
     <plugin>
        <artifactId>maven-ear-plugin</artifactId>
        <version>2.10.1</version>
        <configuration>
        </configuration>
      </plugin>
    </plugins>
  </build>

</project>

Затем просто добавьте все необходимые файлы в каталог src / main / application в проекте ear, и они появятся на верхнем уровне вашего ear-файла.

См. http://maven.apache.org/plugins/maven-ear. -plugin / usage.html

0
Essex Boy 3 Апр 2017 в 13:03