1. 使用system scope
<dependencies>
<dependency>
<groupId>org.richard</groupId>
<artifactId>my-jar</artifactId>
<version>1.0</version>
<scope>system</scope>
<systemPath>${project.basedir}/lib/my-jar.jar</systemPath>
</dependency>
</dependencies>
system scope引入的包,在使用jar-with-dependencies打包时将不会被包含,可以使用resources将本地包打进jar-with-dependencies
<build>
<plugins>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-shade-plugin</artifactId>
<executions>
<execution>
<id>make-assembly</id>
<phase>package</phase>
<goals>
<goal>shade</goal>
</goals>
<configuration>
<descriptorRefs>
<descriptorRef>jar-with-dependencies</descriptorRef>
</descriptorRefs>
<finalName>xxx-jar-with-dependencies</finalName>
</configuration>
</execution>
</executions>
</plugin>
</plugins>
<resources>
<resource>
<targetPath>lib/</targetPath>
<directory>lib/</directory>
<includes>
<include>**/my-jar.jar</include>
</includes>
</resource>
</resources>
</build>
生成的xxx-jar-with-dependencies.jar中,将会包含lib目录以及my-jar.jar,并且能够被在执行的时候被找到。
有的时候这种方法会实效,比如JDBCDriver在声明的时候Class.forName("xxx.Driver")就会说找不到类,用下面两种方法就可以。
2. 将jar包安装到本地repository中
mvn install:install-file -Dfile=my-jar.jar -DgroupId=org.richard -DartifactId=my-jar -Dversion=1.0 -Dpackaging=jar
3. 添加 in project repository,在新机器上执行时就不用运行mvn install:install-file命令了
<repository>
<id>in-project</id>
<name>In Project Repo</name>
<url>file://${project.basedir}/lib</url>
</repository>
<dependency>
<groupId>org.richard</groupId>
<artifactId>my-jar</artifactId>
<version>1.0</version>
</dependency>
你的jar包及路径必须严格遵循格式:
/groupId/artifactId/version/artifactId-verion.jar
本例中: lib/org/richard/my-jar/1.0/my-jar-1.0.jar
maven子模块如何指定路径可以参考以下教程,几乎是一模一样·的
查找多模块maven reactor项目的根目录
我想使用maven-dependency-plugin从我的多模块项目的所有子模块复制EAR文件到一个相对于整个项目的根目录的目录。
也就是说,我的布局看起来类似于这个,名称改变了:
to-deploy/ my-project/ ear-module-a/ ear-module-b/ more-modules-1/ ear-module-c/ ear-module-d/ more-modules-2/ ear-module-e/ ear-module-f/ ...
我希望所有的EAR文件都从各自模块的目标目录复制到my-project/../to-deploy所以我最终
to-deploy/ ear-module-a.ear ear-module-b.ear ear-module-c.ear ear-module-d.ear ear-module-e.ear ear-module-f.ear my-project/ ...
我可以在每个耳模块中使用相对path来完成,如下所示:
org.apache.maven.pluginsmaven-dependency-plugincopyinstallcopy${project.groupId}${project.artifactId}${project.version}ear../../to-deploy
但是我不想在元素中指定一个相对path。 我喜欢像${reactor.root.directory}/../to-deploy ,但我找不到像这样的东西。
另外,我宁愿如果有某种方式来inheritance这个Maven的依赖插件configuration,所以我不必为每个EAR模块指定它。
我也尝试从根pominheritance自定义属性:
${basedir}
但是当我试图在耳模块POM中使用${myproject.root}时, ${basedir}将会parsing为耳模块的basedir。
此外,我发现
那么有没有简单的方法来find一个多模块项目的根?
使用${session.executionRootDirectory}
为了logging, ${session.executionRootDirectory}适用于Maven 3.0.3中的pom文件。 该属性将是您正在运行的目录,所以运行父项目,每个模块都可以获取该根目录的path。
我把在父pom中使用这个属性的插件configuration,以便它被inheritance。 我在configuration文件中使用它,当我知道我要在父项目上运行Maven时,我只会select它。 这样,当我在一个子项目上运行Maven(因为这个variables不会是父项的path)时,我不太可能以一种不希望的方式使用这个variables。
例如,
org.apache.maven.pluginsmaven-dependency-plugincopy-artifactpackagecopy${project.groupId}${project.artifactId}${project.version}${project.packaging}${session.executionRootDirectory}/target/
我在我的项目中使用的东西是重写子模块poms中的属性。
root: ${basedir} moduleA: ${basedir}/.. other/moduleX: ${basedir}/../..
这样你仍然有相对的path,但是你可以在根模块中定义一个插件,你的模块将inheritance它,并为myproject.root取代它。
有一个maven插件可以解决这个问题: directory-maven-plugin
它会将项目的根path分配给您select的属性。 在文档中查看highest-basedir目标。
例如:
org.commonjava.maven.pluginsdirectory-maven-plugin0.1directorieshighest-basedirinitializemain.basedir
然后在父/子pom.xml中的任何位置使用${main.basedir} 。
正如其他人所说,directory-maven-plugin是要走的路。 不过,我发现它与'目录'的目标最好的工作,如下所述: https : //stackoverflow.com/a/37965143/6498617 。
我更喜欢使用最高basedir对于多模块项目,嵌套多模块poms不工作。 目标目录允许您将属性设置为整个项目中任何模块的path,包括当然的根目录。 它也比$ {session.executionRootDirectory}更好,因为它总是可以工作的,不pipe你是build立根还是子模块,而不pipe当前你的mvn工作目录。
我遇到了类似的问题,因为我需要在项目之间复制文件。 Maven所做的是合乎逻辑的,因为它将保持存储库中安装的pom.xml远离硬编码值。
我的解决scheme是将复制的目录放在Maven工件中,然后使用Ant来提取/复制
我没有意识到find多模块项目的根的“好方法”。 但是你也许可以改进一下你目前的方法。
第一种方法是直接在根项目下创build一个附加模块,将所有EAR声明为依赖关系,并使用dependency:copy-dependencies关系将模块的依赖dependency:copy-dependencies复制到待to-deploy目录(相对)。 是的path仍然是相对的,但由于依赖插件configuration将集中,我不觉得这很烦人。
第二种方法是使用Maven Assembly Plugin代替Maven Dependency Plugin来使用dir格式创build一个分发(这将在目录中创build一个分发)。 这实际上是我会做的。
另一个解决scheme是使用ant任务将“rootdir = $ {basedir}”写入根项目中的目标/ root.properties,然后使用Properties Plugin将该文件重新读入。我还没有尝试过我自己,但我想它应该工作..?
以下小档案为我工作。 我需要这样一个configurationCheckStyle,我把它放到项目根目录下的config目录下,所以我可以从主模块和子模块中运行它。
root-dir${project.basedir}/../../config/checkstyle.xml${project.basedir}/../config
它不适用于嵌套模块,但我相信它可以修改为使用不同的exists几个configuration文件。 (我不知道为什么在validation标签中应该有“../ ..”,而在overriden属性本身中只是“..”,但它只能以这种方式工作。)
所以:在某些父项属性的某个地方项目我有我需要稍后关系的文件,这就是为什么我需要绝对path到处。 所以,我在groovy的帮助下得到它:
import java.io.File String p =project.properties['env-properties-file'] File f = new File(p) if (!f.exists()) { f = new File("../" + p) if (!f.exists()) { f = new File("../../" + p) } } // setting path together with file name in variable xyz_format project.properties['xyz_format'] =f.getAbsolutePath() + File.separator + "abc_format.xml"
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)