【发布时间】:2022-01-24 11:11:15
【问题描述】:
如果这已经有答案,我还没有设法找到它。在认输并在这里问之前,我已经花了很多时间才走到这一步!谈到 Maven,我会将自己描述为“周日司机”。
插件版本:compiler=3.9.0;资源和依赖=3.2.0;罐子=3.2.2;组装=3.3.0。
我有两个 Maven 项目,我们称之为 AppA 和 Proj1。 Proj1 包含所有“工作”代码和第 3 方 jar 依赖项。
AppA 包含 Main 类和应用程序的文件夹,例如“conf”和“logs”。 这两个项目都有“jar”包装。
AppA 的 pom 具有创建 jar 文件所需的插件,该 jar 文件具有将其类路径中所有必需的 jar 文件定义为“lib/xxx.jar”的清单。它还具有“Proj1”作为依赖项。
我遇到的问题是 Maven 在将所有依赖的 jar 复制到“lib”文件夹之前正在组装 zip 文件。这意味着 zip 文件中缺少“lib”文件夹。
如果我从单个项目构建 AppA,则会在填充“lib”文件夹后组装 zip 文件,
谁能告诉我在组装 zip 文件之前我需要做什么来说服 Maven 将依赖的 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>
【问题讨论】:
-
看不到你的 pom 文件。我建议创建包含适当结构的 zip 文件,而不是将文件复制到 lib 文件夹,然后打包到一个 zip 文件...
-
感谢@khmarbaise 的快速回复。我希望我可以避免添加长 pom 文件。我现在已经这样做了。它有帮助吗?直接依赖项是“com.w3p.njams.client”(又名 Proj1)。这也有一个依赖“com.w3p.api.iib10”(一般描述中没有提到)。
-
老实说,在那个 pom 文件中有很多错误的地方。从所有插件中删除 outputDirectory 的所有配置(遵守约定!)为什么要在验证阶段复制资源?那是错误的......使用 maven-dependency-plugin 创建一个 lib 目录也是错误的。更改所有 maven-jar-plugin 的东西(只保留默认值)。使用 maven-assembly-plugin + 程序集描述符来描述您想要实现的目标......在项目的根目录中创建一个 zip 文件是错误的。
target目录是正确的位置。 -
另外,插件作为依赖也是错误的...我强烈推荐一个 Maven 咨询来支持您并为您节省大量工作和错误的事情...
-
@khmarbaise 我对我有错误并不感到惊讶。我的起始 pom 代码是我大约 3 年前创建的,用于为单个 maven 项目构建一个 zip 文件。我使用 Maven 文档、博客文章、stackOverflow 答案和一个带有狡猾的 bi tof 本机的组合来做到这一点。我会仔细阅读您的建议,RTFM 并一次进行一项更改。非常感谢
标签: java maven multi-project