压缩组装后从依赖项目复制的 Maven 依赖项

maven dependencies copied from dependent project after zip assemby

如果这已经有了答案,我还没找到呢。我花了很多时间才走到这一步,然后才认输并在这里问!说到 Maven,我会形容自己是 'Sunday driver'.

插件版本:compiler=3.9.0;资源和依赖关系=3.2.0;罐子=3.2.2;程序集=3.3.0.

我有两个 Maven 项目,我们分别调用 AppA 和 Proj1。 Proj1 包含所有 'working' 代码和第三方 jar 依赖项。

AppA 包含主 class 和应用程序的文件夹,例如 'conf' 和 'logs'。 这两个项目都有 'jar' 包装。

AppA 的 pom 具有创建 jar 文件所需的插件,该文件的清单在其 class 路径中将所有必需的 jar 文件定义为 'lib/xxx.jar'。它还具有 'Proj1' 作为依赖项。

我遇到的问题是 Maven 在将所有依赖的 jar 文件复制到 'lib' 文件夹之前正在组装 zip 文件。这意味着压缩文件中缺少 'lib' 文件夹。

如果我从单个项目构建 AppA,zip 文件是在填充 'lib' 文件夹后组装的,

任何人都可以告诉我我需要做什么才能说服 Maven 在组装 zip 文件之前将依赖的 jar 文件复制到 'lib'?

我之所以有这个结构是为了以后可以创建AppB + Proj1。

此外,lib 文件包含所有 Maven 插件 jar 及其依赖项。当我从单个项目构建时,它们被排除在外。

[pom.xml]

<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 https://maven.apache.org/xsd/maven-4.0.0.xsd">
<modelVersion>4.0.0</modelVersion>
<groupId>com.w3p.njams</groupId>
<artifactId>com.w3p.iib.njams.client</artifactId>
<version>Beta-1.0.1.0</version>
<packaging>jar</packaging>
<name>nJAMS Client App for IIB</name>
<description>nJAMS Client App for IIB</description>

<properties>
    <jdk.version>1.8</jdk.version>
    <maven.compiler.version>3.9.0</maven.compiler.version>
    <njams.client.version>Beta-1.0.1.0 </njams.client.version>
    <client.build.dir>njamsIIBClient</client.build.dir>
    <ibm.api.artifact>com.w3p.api.iib10</ibm.api.artifact>
    <ibm.api.version>Beta-1.0.1.0</ibm.api.version>
    <dependency.version>3.2.0</dependency.version>
    <resources.plugin.version>3.2.0</resources.plugin.version>
    <lifecycle.mapping.version>1.0.0</lifecycle.mapping.version>
    <!-- ** Logging ** -->
    <log4j.version>2.17.1</log4j.version>
    <disruptor.version>3.4.4</disruptor.version>
</properties>

<dependencies>

    <!-- ** Logging ** -->
    <!-- https://mvnrepository.com/artifact/org.apache.logging.log4j/log4j-core -->
    <dependency>
        <groupId>org.apache.logging.log4j</groupId>
        <artifactId>log4j-core</artifactId>
        <version>${log4j.version}</version>
    </dependency>
    <!-- https://mvnrepository.com/artifact/org.apache.logging.log4j/log4j-slf4j-impl -->
    <dependency>
        <groupId>org.apache.logging.log4j</groupId>
        <artifactId>log4j-slf4j-impl</artifactId>
        <version>${log4j.version}</version>
        <scope>test</scope>
    </dependency>
    <!-- https://mvnrepository.com/artifact/com.lmax/disruptor -->
    <!-- for async logging -->
    <dependency>
        <groupId>com.lmax</groupId>
        <artifactId>disruptor</artifactId>
        <version>${disruptor.version}</version>
    </dependency>

    <!-- ** The nJAMS Client common to IIB and ACE -->
    <dependency>
        <groupId>com.w3p.njams</groupId>
        <artifactId>com.w3p.njams.client</artifactId>
        <version>${njams.client.version}</version>
    </dependency>
    <!-- ** W3P's IIB/ACE API ** -->
    <dependency>
        <groupId>com.w3p.njams</groupId>
        <artifactId>${ibm.api.artifact}</artifactId>
        <version>${ibm.api.version}</version>
    </dependency>

    <!-- https://mvnrepository.com/artifact/org.apache.maven.plugins/maven-dependency-plugin -->
    <dependency>
        <groupId>org.apache.maven.plugins</groupId>
        <artifactId>maven-dependency-plugin</artifactId>
        <version>${dependency.version}</version>
    </dependency>
    <!-- https://mvnrepository.com/artifact/org.apache.maven.plugins/maven-resources-plugin -->
    <dependency>
        <groupId>org.apache.maven.plugins</groupId>
        <artifactId>maven-resources-plugin</artifactId>
        <version>3.2.0</version>
    </dependency>
    <!-- https://mvnrepository.com/artifact/org.apache.maven.plugins/maven-assembly-plugin -->
    <dependency>
        <groupId>org.apache.maven.plugins</groupId>
        <artifactId>maven-assembly-plugin</artifactId>
        <version>3.3.0</version>
    </dependency>
    <!-- https://mvnrepository.com/artifact/org.apache.maven.plugins/maven-source-plugin -->
    <dependency>
        <groupId>org.apache.maven.plugins</groupId>
        <artifactId>maven-source-plugin</artifactId>
        <version>3.2.1</version>
    </dependency>
</dependencies>

<build>
    <!--        <pluginManagement>  -->
    <plugins>
        <!-- *** In Build Sequence *** -->
        <!-- Maven Resources Plugin  - copies resources fron Eclipse project folders to output build folder = cliemt-->
        <plugin>
            <groupId>org.apache.maven.plugins</groupId>
            <artifactId>maven-resources-plugin</artifactId>
            <version>${resources.plugin.version}</version>
            <executions>
                <execution>
                    <id>copy-resources</id>
                    <!-- bind to the validate phase -->
                    <phase>validate</phase>
                    <goals>
                        <goal>copy-resources</goal>
                    </goals>
                    <configuration>
                        <includeEmptyDirs>true</includeEmptyDirs>
                        <outputDirectory>${project.build.directory}/${client.build.dir}_${project.version}</outputDirectory>
                        <nonFilteredFileExtensions>
                            <nonFilteredFileExtension>cache</nonFilteredFileExtension>
                            <!-- serialised FlowTtoProcessModelCache -->
                            <nonFilteredFileExtension>pmd</nonFilteredFileExtension>
                            <!-- serialised ProcessModels -->
                        </nonFilteredFileExtensions>
                        <resources>
                            <resource>
                                <targetPath>${project.build.directory}/${client.build.dir}_${project.version}/conf</targetPath>
                                <directory>conf</directory>
                                <filtering>true</filtering>
                                <exclude>log4j2-test.xml</exclude>
                                <exclude>njams*.xml</exclude>
                            </resource>
                            <resource>
                                <targetPath>${project.build.directory}/${client.build.dir}_${project.version}/flowToProcessModelCache</targetPath>
                                <directory>flowToProcessModelCache</directory>
                                <filtering>true</filtering>
                                <include>dummy.cache</include>
                            </resource>
                            <resource>
                                <targetPath>${project.build.directory}/${client.build.dir}_${project.version}/certs</targetPath>
                                <directory>certs</directory>
                                <filtering>true</filtering>
                                <include>dummy.cert</include>
                                <exclude>*-endpoint</exclude>
                                <exclude>*-instanceId</exclude>
                                <exclude>*.key</exclude>
                                <exclude>*.pem</exclude>
                            </resource>
                            <resource>
                                <targetPath>${project.build.directory}/${client.build.dir}_${project.version}/logs</targetPath>
                                <directory>logs</directory>
                                <filtering>true</filtering>
                                <exclude>njams*.log</exclude>
                            </resource>
                            <resource>
                                <targetPath>${project.build.directory}/${client.build.dir}_${project.version}/images</targetPath>
                                <directory>images</directory>
                                <filtering>false</filtering>
                            </resource>
                            <resource>
                                <targetPath>${project.build.directory}/${client.build.dir}_${project.version}/jms</targetPath>
                                <directory>jms</directory>
                                <filtering>true</filtering>
                                <include>JNDI_Local/*.bindings</include>
                                <include>JNDI_Remote/*.bindings</include>
                            </resource>
                            <resource>
                                <targetPath>${project.build.directory}/${client.build.dir}_${project.version}/monitoringProfiles</targetPath>
                                <directory>monitoringProfiles</directory>
                                <filtering>true</filtering>
                                <include>dummyProfile.xml</include>
                                <include>*.xsd</include>
                            </resource>
                            <resource>
                                <targetPath>${project.build.directory}/${client.build.dir}_${project.version}/processModels</targetPath>
                                <directory>processModels</directory>
                                <filtering>true</filtering>
                                <include>dummy.pmd</include>
                            </resource>
                            <resource>
                                <targetPath>${project.build.directory}/${client.build.dir}_${project.version}/scripts</targetPath>
                                <directory>scripts</directory>
                                <filtering>false</filtering>
                            </resource>
                        </resources>
                    </configuration>
                </execution>
            </executions>
        </plugin>

        <!-- ** Maven Compiler Plugin ** -->
        <plugin>
            <groupId>org.apache.maven.plugins</groupId>
            <artifactId>maven-compiler-plugin</artifactId>
            <version>${maven.compiler.version}</version>
            <configuration>
                <source>${jdk.version}</source>
                <target>${jdk.version}</target>
            </configuration>
        </plugin>

        <!-- Maven Dependency Plugin -> copies dependenciea to  'appName'_${project.varsion}  -->
        <plugin>
            <groupId>org.apache.maven.plugins</groupId>
            <artifactId>maven-dependency-plugin</artifactId>
            <version>${dependency.version}</version>
            <executions>
                <execution>
                    <id>copy-dependencies</id>
                    <phase>install</phase>
                    <!-- prepare-package -->
                    <!-- waspacjage -->
                    <goals>
                        <goal>copy-dependencies</goal>
                    </goals>
                    <configuration>
                        <outputDirectory>${project.build.directory}/${client.build.dir}_${project.version}/lib</outputDirectory>
                        <overWriteReleases>false</overWriteReleases>
                        <overWriteSnapshots>false</overWriteSnapshots>
                        <overWriteIfNewer>true</overWriteIfNewer>
                        <!-- The next line actually excludes the scope 'test' jars from the build -->
                        <includeScope>compile</includeScope>
                    </configuration>
                </execution>
            </executions>
        </plugin>

        <!-- Maven Jar Plugin - Create the jar file and it's manifest entries -->
        <plugin>
            <groupId>org.apache.maven.plugins</groupId>
            <artifactId>maven-jar-plugin</artifactId>
            <version>3.2.2</version>
            <configuration>
                <outputDirectory>${project.build.directory}/${client.build.dir}_${project.version}</outputDirectory>
                <finalName>${client.build.dir}-${project.version}</finalName>
                <excludes>
                    <!-- -->
                    <exclude>**/*.properties</exclude>
                    <exclude>**/*.xml</exclude>
                    <!-- -->
                </excludes>
                <archive>
                    <manifest>
                        <addClasspath>true</addClasspath>
                        <classpathPrefix>lib/</classpathPrefix>
                        <mainClass>com.w3p.im.iib.mon.client.IIBMonitoringClient</mainClass>
                    </manifest>
                    <manifestEntries>
                        <Class-Path>. resources</Class-Path>
                    </manifestEntries>
                </archive>
            </configuration>
        </plugin>
        
        <!-- Maven Assembly Plugin -->
        <plugin>
            <groupId>org.apache.maven.plugins</groupId>
            <artifactId>maven-assembly-plugin</artifactId>
            <version>3.3.0</version>
            <executions>
                <execution>
                    <id>create-archive</id> <!-- this is used for inheritance merges -->
                    <phase>package</phase> <!-- append to the packaging phase. -->
                    <goals>
                        <goal>single</goal> <!-- goals == mojos -->
                    </goals>
                    <configuration>
                        <appendAssemblyId>false</appendAssemblyId>
                        <descriptors>
                            <descriptor>src/main/assembly/zip.xml</descriptor>
                        </descriptors>
                        <outputDirectory>${project.basedir}</outputDirectory>
                    </configuration>
                </execution>
            </executions>
        </plugin>

    </plugins>
</build>

[zip.xml]

<assembly>
<id>zip</id>
<baseDirectory>/</baseDirectory>
<includeBaseDirectory>false</includeBaseDirectory>
<formats>
    <format>zip</format>
</formats>

<fileSets>
    <fileSet>
        <directory>${project.build.directory}/${client.build.dir}_${project.version}</directory>
        <outputDirectory>${client.build.dir}_${project.version}</outputDirectory>
    </fileSet>
</fileSets>

这是因为 maven-assembly-pluginmaven-dependency-plugin 阶段 (install) 在前一个阶段 (package) 执行。尝试设置插件的执行,使其按您的预期运行。

我还建议一种不同的方法,我认为它可以简化您的构建配置 - 使用 multi-module pom 将聚合两个项目。比 AppA 的具体 pom.xml 使用 Proj1 作为依赖。它将使您免于复制文件和重新打包。