【问题标题】:ClassNotFoundException when loading class from JAR从 JAR 加载类时出现 ClassNotFoundException
【发布时间】:2019-09-08 15:35:51
【问题描述】:

我正在尝试创建一个连接到 Impala、执行查询并返回查询结果的简单程序。但是,我一开始就卡住了:由于某种原因,我无法从 JAR 文件中加载 Impala JDBC Driver 类。

我要加载的 JAR 文件位于我项目根文件夹中的文件夹 lib/ 中。否则我的项目遵循正常的 Maven 目录布局。我已将 JAR 文件的路径添加到我的项目的 pom.xml 中。我检查了 MANIFEST.MF 并且路径在那里。我尝试使用 -classpath lib/ImpalaJDBC41.jar 选项运行我的程序,并且我还尝试将 JAR 文件放到 src/main/resources/ 文件夹中。

这是我设置类路径的 pom.xml 的一部分:

<plugin>
    <groupId>org.apache.maven.plugins</groupId>
    <artifactId>maven-shade-plugin</artifactId>
    <version>3.2.1</version>
    <executions>
        <!-- Run shade goal on package phase -->
        <execution>
            <phase>package</phase>
            <goals>
                <goal>shade</goal>
            </goals>
            <configuration>
                <transformers>
                    <!-- add Main-Class to manifest file -->
                    <transformer implementation="org.apache.maven.plugins.shade.resource.ManifestResourceTransformer">
                        <manifestEntries>
                            <Main-Class>com.example.App</Main-Class>
                            <Class-Path>lib/ImpalaJDBC41.jar</Class-Path>
                        </manifestEntries>
                    </transformer>
                </transformers>
            </configuration>
        </execution>
    </executions>
</plugin>

这是我的 MANIFEST.MF

Manifest-Version: 1.0
Archiver-Version: Plexus Archiver
Built-By: 400594
Class-Path: lib/ImpalaJDBC41.jar
Created-By: Apache Maven 3.5.3
Build-Jdk: 1.8.0_172
Main-Class: com.example.App

这是我的 Java 代码:

package com.example;

import java.lang.Class;

public final class App {
    private App() {
    }

    /**
     * @param args The arguments of the program.
     */
    public static void main(String[] args) {  
        try {
            Class<?> cls = Class.forName("com.cloudera.impala.jdbc41.Driver");
            System.out.println("Class found: " + cls.getName());
        } catch (ClassNotFoundException ex) {
            System.out.println("Class not found: " + ex);
        }
    }
}

无论我尝试做什么,我都会得到 java.lang.ClassNotFoundException。我怀疑这个问题在某种程度上与类路径有关,但我不知道它是什么。

【问题讨论】:

  • 我建议打开 jar 文件,并检查它里面是否真的有那个类?
  • @jr593 我查了一下,它就在那里。

标签: java class jar classpath


【解决方案1】:

据我所知,在您的 pom.xml 配置标记中删除 &lt;Class-Path&gt; 标记并添加类路径,如下所示。这将解决您的问题。这是更多clarification的链接。 "org.apache.maven.plugins.shade.resource.ManifestResourceTransformer" 也没有类路径标签。

<configuration>
          <additionalClasspathElements>
            <additionalClasspathElement>path/to/additional/resources</additionalClasspathElement>

</configuration>

【讨论】:

  • 我通过在 标签内添加标签 使用 ManifestResourceTransformer 添加了 Class-Path。这是规范maven.apache.org/plugins/maven-shade-plugin/examples/…。滚动到“使用 ManifestResourceTransformer 设置清单条目”。但是,我也尝试了您提出的解决方案,但它也不起作用(至少对我而言)。我开始怀疑这是与系统相关的问题。
  • 嗨,我想通了。我的 lib/ 文件夹位于我项目的根文件夹中。当我构建 JAR 文件时,它会转到 target/ 文件夹。因此,当我将 lib/ 文件夹移动到 target/ 文件夹时,它就开始工作了。现在我想起来了,这很有意义,因为 Class-Path 当然是相对于 JAR 文件的位置。
猜你喜欢
  • 1970-01-01
  • 2017-07-08
  • 2019-03-18
  • 2013-04-15
  • 1970-01-01
  • 2011-08-28
  • 2012-09-05
  • 2017-05-24
  • 2014-07-21
相关资源
最近更新 更多