我正在尝试创建一个连接到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。我怀疑这个问题与类路径有关,但是我不知道是什么。
答案 0 :(得分:2)
据我所知,在您的pom.xml配置标记中,删除<Class-Path>
标记并添加类路径,如下所示。这样可以解决您的问题。这是更多clarification的链接。另外, "org.apache.maven.plugins.shade.resource.ManifestResourceTransformer" 中没有类路径标记。
<configuration>
<additionalClasspathElements>
<additionalClasspathElement>path/to/additional/resources</additionalClasspathElement>
</configuration>