加jar包啥时候需要添加类路径

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了加jar包啥时候需要添加类路径相关的知识,希望对你有一定的参考价值。

参考技术A 您好,当需要在Java程序中使用第三方的jar包时,就需要添加类路径。添加类路径的方法有两种:一种是在编译时直接指定类路径,即使用javac命令时使用-classpath参数指定类路径;另一种是在运行时动态添加类路径,即使用java命令时使用-classpath参数指定类路径。添加类路径的目的是让Java程序能够找到第三方jar包中的类,从而能够正确地使用这些类。

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

【中文标题】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 下。

【讨论】:

以上是关于加jar包啥时候需要添加类路径的主要内容,如果未能解决你的问题,请参考以下文章

RFT中JAR包怎么配置?怎么添加jar包进去?

如何将第三方 jar 添加到 HDP 沙箱上的类路径?

Spark.jars 未将 jars 添加到类路径

将tomcat jar / lib目录添加到Mac OS X上的eclipse类路径[重复]

Visual Studio Code,Java 扩展,如何将 jar 添加到类路径

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