压缩组装后从依赖项目复制的 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-plugin
比 maven-dependency-plugin
阶段 (install
) 在前一个阶段 (package
) 执行。尝试设置插件的执行,使其按您的预期运行。
我还建议一种不同的方法,我认为它可以简化您的构建配置 - 使用 multi-module pom 将聚合两个项目。比 AppA
的具体 pom.xml
使用 Proj1
作为依赖。它将使您免于复制文件和重新打包。
如果这已经有了答案,我还没找到呢。我花了很多时间才走到这一步,然后才认输并在这里问!说到 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-plugin
比 maven-dependency-plugin
阶段 (install
) 在前一个阶段 (package
) 执行。尝试设置插件的执行,使其按您的预期运行。
我还建议一种不同的方法,我认为它可以简化您的构建配置 - 使用 multi-module pom 将聚合两个项目。比 AppA
的具体 pom.xml
使用 Proj1
作为依赖。它将使您免于复制文件和重新打包。