Maven:将文件夹或 jar 文件添加到当前类路径中

问题描述 投票:0回答:5

我正在使用 maven-compile 插件来编译类。现在我想将一个 jar 文件添加到当前的类路径中。该文件保留在另一个位置(假设 c:/jars/abc.jar 。我更喜欢将此文件留在这里)。我怎样才能做到这一点?

如果我在参数中使用类路径:

<configuration>
 <compilerArguments>
  <classpath>c:/jars/abc.jar</classpath>
 </compilerArguments>
</configuration>

它将不起作用,因为它将覆盖当前的类路径(包括所有依赖项)

maven-2 jar classpath
5个回答
11
投票

这可能之前已经被问过。请参阅我可以将 jar 添加到 maven 2 构建类路径而不安装它们吗?

简而言之:将您的 jar 包含为系统范围的依赖项。这需要指定 jar 的绝对路径。

另请参阅 http://maven.apache.org/guides/introduction/introduction-to-dependency-mechanism.html


4
投票

编译器插件的类路径设置是两个参数。像这样改变它,它对我有用:

<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>

3
投票

docsexample 来看,不清楚是否允许类路径操作。

<configuration>
 <compilerArgs>
  <arg>classpath=${basedir}/lib/bad.jar</arg>
 </compilerArgs>
</configuration>

但请参阅 Java 文档(另见 https://www.cis.upenn.edu/~bcpierce/courses/629/jdkdocs/tooldocs/solaris/javac.html

-classpath path 指定 javac 用于查找运行 javac 所需的类或被您所在的其他类引用的类的路径 编译。覆盖默认或 CLASSPATH 环境变量 如果已设置。

也许可以获取当前的类路径并扩展它,
参见在maven中,如何输出正在使用的类路径?

    <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>

读取文件(将文件读入 Maven 属性

<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>

2
投票

我们混合了此处找到的两个答案来解决类似的问题。我们的项目仅在编译阶段需要 JAR,但使用 system 范围添加本地依赖项,这是没有用的,因为 Maven 拒绝工件发布,并出现与缺少依赖项相关的错误。

使用的片段如下:

  <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。


0
投票

使用 antrun 插件的解决方案(将 your_jar_or_classes_folder 添加到类路径):

    <plugin>
        <artifactId>maven-antrun-plugin</artifactId>
        <executions>
            <execution>
                <id>read classpath</id>
                <phase>generate-resources</phase>
                <goals>
                    <goal>run</goal>
                </goals>
                <configuration>
                    <exportAntProperties>true</exportAntProperties>
                    <target>
                        <property name="cp" refid="maven.compile.classpath"/>
                    </target>
                </configuration>
            </execution>
        </executions>
    </plugin>
    <plugin>
        <artifactId>maven-compiler-plugin</artifactId>
        <configuration>
            <compilerArgs>
                <arg>-cp</arg>
                <arg>${cp}${path.separator}your_jar_or_classes_folder</arg>
            </compilerArgs>
        </configuration>
    </plugin>
© www.soinside.com 2019 - 2024. All rights reserved.