Maven:将文件夹或 jar 文件添加到当前类路径中
Posted
技术标签:
【中文标题】Maven:将文件夹或 jar 文件添加到当前类路径中【英文标题】:Maven: add a folder or jar file into current classpath 【发布时间】:2011-03-25 13:03:23 【问题描述】:我正在使用 maven-compile 插件来编译类。现在我想将一个 jar 文件添加到当前的类路径中。该文件位于另一个位置(比方说 c:/jars/abc.jar 。我更愿意将此文件留在这里)。我该怎么做?
如果我在参数中使用类路径:
<configuration>
<compilerArguments>
<classpath>c:/jars/abc.jar</classpath>
</compilerArguments>
</configuration>
它不起作用,因为它将覆盖当前的类路径(包括所有依赖项)
【问题讨论】:
这个 jar 需要在那个位置,还是你只需要一种方法来包含本地 jar? Maven, how to add additional libs not available in repo、Maven. What to do with “homeless” jars?、Local jars are not included in class path 和许多其他人的副本。 你找到添加目录的方法了吗?而不是在类路径中添加每个单独的 jar? 【参考方案1】:这可能以前被问过。见Can I add jars to maven 2 build classpath without installing them?
简而言之:将您的 jar 作为依赖项包含在系统范围内。这需要指定 jar 的绝对路径。
另见http://maven.apache.org/guides/introduction/introduction-to-dependency-mechanism.html
【讨论】:
我想知道人们什么时候会停止建议滥用system
范围请参阅您链接到的问题中Brian 的answer。另见this previous answer。
还有一个问题。如果我需要在类路径中添加一个文件夹(包含许多 .class 文件)。我该怎么做。
@Pascal Thivent -- 好吧,当人们停止像 maven Central 的 org.bytedeco javacv-0.9 项目中包含的 bin.zip 这样的废话时,它就会结束。如果您谈论正常的 maven 行为,那么作为用户,我无法修复 maven 上传.....也许我应该向 maven Central 投诉。
不幸的是,这不适用于 jar 或类的文件夹或目录!【参考方案2】:
从docs 和example 不清楚是否允许类路径操作。
<configuration>
<compilerArgs>
<arg>classpath=$basedir/lib/bad.jar</arg>
</compilerArgs>
</configuration>
但请参阅Java docs(也可查看https://www.cis.upenn.edu/~bcpierce/courses/629/jdkdocs/tooldocs/solaris/javac.html)
-classpath path 指定 javac 用于查找运行 javac 所需的类或被其他类引用的路径 编译。覆盖默认或 CLASSPATH 环境变量 如果已设置。
也许可以获取当前的类路径并对其进行扩展, 见in maven, how output the classpath being used?
<properties>
<cpfile>cp.txt</cpfile>
</properties>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-dependency-plugin</artifactId>
<version>2.9</version>
<executions>
<execution>
<id>build-classpath</id>
<phase>generate-sources</phase>
<goals>
<goal>build-classpath</goal>
</goals>
<configuration>
<outputFile>$cpfile</outputFile>
</configuration>
</execution>
</executions>
</plugin>
读取文件 (Read a file into a Maven property)
<plugin>
<groupId>org.codehaus.gmaven</groupId>
<artifactId>gmaven-plugin</artifactId>
<version>1.4</version>
<executions>
<execution>
<phase>generate-resources</phase>
<goals>
<goal>execute</goal>
</goals>
<configuration>
<source>
def file = new File(project.properties.cpfile)
project.properties.cp = file.getText()
</source>
</configuration>
</execution>
</executions>
</plugin>
最后
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-compiler-plugin</artifactId>
<version>3.6.1</version>
<configuration>
<compilerArgs>
<arg>classpath=$cp:$basedir/lib/bad.jar</arg>
</compilerArgs>
</configuration>
</plugin>
【讨论】:
令人惊讶的是,没有简单的方法可以将非 maven 依赖项的外部文件夹添加到 maven 的类路径中。这里的方法似乎都不起作用,它们以无效标志失败:classpath=/pathtojar.jar:/anotherjar.jar【参考方案3】:编译器插件的类路径设置是两个 args。像这样改变它,它对我有用:
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-compiler-plugin</artifactId>
<version>3.6.1</version>
<configuration>
<compilerArgs>
<arg>-cp</arg>
<arg>$cp:$basedir/lib/bad.jar</arg>
</compilerArgs>
</configuration>
</plugin>
我使用 gmavenplus-plugin 读取路径并创建属性 'cp':
<plugin>
<!--
Use Groovy to read classpath and store into
file named value of property <cpfile>
In second step use Groovy to read the contents of
the file into a new property named <cp>
In the compiler plugin this is used to create a
valid classpath
-->
<groupId>org.codehaus.gmavenplus</groupId>
<artifactId>gmavenplus-plugin</artifactId>
<version>1.12.0</version>
<dependencies>
<dependency>
<groupId>org.codehaus.groovy</groupId>
<artifactId>groovy-all</artifactId>
<!-- any version of Groovy \>= 1.5.0 should work here -->
<version>3.0.6</version>
<type>pom</type>
<scope>runtime</scope>
</dependency>
</dependencies>
<executions>
<execution>
<id>read-classpath</id>
<phase>validate</phase>
<goals>
<goal>execute</goal>
</goals>
</execution>
</executions>
<configuration>
<scripts>
<script><![CDATA[
def file = new File(project.properties.cpfile)
/* create a new property named 'cp'*/
project.properties.cp = file.getText()
println '<<< Retrieving classpath into new property named <cp> >>>'
println 'cp = ' + project.properties.cp
]]></script>
</scripts>
</configuration>
</plugin>
【讨论】:
【参考方案4】:我们混合了此处找到的两个答案来解决类似的问题。我们的项目只在编译阶段需要一个 JAR,但是添加了一个本地依赖,使用 system 范围,这是无用的,因为 Maven 拒绝工件发布,并出现与缺少依赖相关的错误。
使用的sn-ps如下:
<properties>
<classpathfile>$basedir/classpathfile.classpath</classpathfile>
</properties>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-dependency-plugin</artifactId>
<version>2.9</version>
<executions>
<execution>
<id>build-classpath</id>
<phase>generate-sources</phase>
<goals>
<goal>build-classpath</goal>
</goals>
<configuration>
<outputFile>$classpathfile</outputFile>
</configuration>
</execution>
</executions>
</plugin>
<plugin>
<groupId>org.codehaus.gmaven</groupId>
<artifactId>gmaven-plugin</artifactId>
<version>1.4</version>
<executions>
<execution>
<phase>generate-resources</phase>
<goals>
<goal>execute</goal>
</goals>
<configuration>
<source>
def file = new File(project.properties.classpathfile)
project.properties.originalClassPath = file.getText()
</source>
</configuration>
</execution>
</executions>
</plugin>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-compiler-plugin</artifactId>
<version>3.8.1</version>
<configuration>
<compilerArgs>
<arg>-cp</arg>
<arg>$originalClassPath$path.separator$basedir/../../../bin/POM_RUNTIME_PLACEHOLDER/ExtraJar.jar</arg>
</compilerArgs>
</configuration>
</plugin>
Maven 能够编译并成功部署工件。 如果有人感兴趣,完整的 POM 可以在 GitHub 项目 NuReflector 下获得,defaultPOM.template 在 src/NuReflector 下。
【讨论】:
以上是关于Maven:将文件夹或 jar 文件添加到当前类路径中的主要内容,如果未能解决你的问题,请参考以下文章