maven deployable jar“java.lang.ClassNotFoundException:org.apache.hadoop.hive.jdbc.HiveDriver”错误

时间:2017-06-26 08:36:55

标签: java maven jdbc

我有一个可部署的maven项目,我正在尝试使用JDBC连接到配置单元服务器。这是我的pom文件:

<dependencies>
    <!-- https://mvnrepository.com/artifact/org.apache.hive/hive-jdbc -->
    <dependency>
        <groupId>org.apache.hive</groupId>
        <artifactId>hive-jdbc</artifactId>
        <version>2.1.1</version>
   </dependency>
</dependencies>
<build>
    <plugins>
        <plugin>
            <groupId>org.apache.maven.plugins</groupId>
            <artifactId>maven-compiler-plugin</artifactId>
            <configuration>
                <source>1.8</source>
                <target>1.8</target>
            </configuration>
        </plugin>
        <plugin>
            <groupId>org.apache.maven.plugins</groupId>
            <artifactId>maven-jar-plugin</artifactId>
            <configuration>
                <archive>
                    <manifest>
                        <addClasspath>true</addClasspath>
                        <mainClass>com.test.Main</mainClass>
                    </manifest>
                </archive>
            </configuration>
        </plugin>
    </plugins>
</build>

这将生成一个jar文件,其中包含manifest.mf,如下所示:

Manifest-Version: 1.0
Archiver-Version: Plexus Archiver
Built-By: test
Class-Path: hive-jdbc-2.1.1.jar hive-common-2.1.1.jar ...
Created-By: Apache Maven 3.3.9
Build-Jdk: 1.8.0_72
Main-Class: com.test.Main

现在,当我尝试使用java -jar test.jar运行jar文件时,我得到了

java.lang.ClassNotFoundException: org.apache.hadoop.hive.jdbc.HiveDriver
    at java.net.URLClassLoader.findClass(URLClassLoader.java:381)
    at java.lang.ClassLoader.loadClass(ClassLoader.java:424)
    at sun.misc.Launcher$AppClassLoader.loadClass(Launcher.java:331)
    at java.lang.ClassLoader.loadClass(ClassLoader.java:357)
    at java.lang.Class.forName0(Native Method)
    at java.lang.Class.forName(Class.java:264)

为什么即使在清单文件的类路径中正确配置了jar文件,我也会收到此异常?

感谢。

3 个答案:

答案 0 :(得分:2)

java中找不到依赖项中引用的jar。可能与目标jar不在同一个文件夹中。

根据您对deploayable maven项目的意思,您有几种可能的解决方案

  • 将依赖项添加到容器的类路径
  • 构建一个包含依赖关系的“胖”jar(使用maven shade或assembly plugin)

答案 1 :(得分:0)

您可以添加maven-dependency-plugin以将依赖项从本地或远程存储库复制到指定位置

<plugin>
        <groupId>org.apache.maven.plugins</groupId>
        <artifactId>maven-dependency-plugin</artifactId>
        <version>2.4</version>
        <executions>
            <execution>
                <id>copy-dependencies</id>
                <phase>package</phase>
                <goals>
                    <goal>copy-dependencies</goal>
                </goals>
                <configuration>
                    <includeScope>compile</includeScope>
                    <outputDirectory>${project.build.directory}</outputDirectory>
                </configuration>
            </execution>
        </executions>
    </plugin>

或另一个选项使用maven-assembly-pluginhere

答案 2 :(得分:0)

确定你想要哪个罐子(蜂房)......因为它有不同的版本
旧的verison jar是

org.apache.hadoop.hive.jdbc.HiveDriver

这是mvnrepository

,最新的jar org.apache.hive.jdbc.HiveDriver这里是新的settings

你的错误是使用旧的依赖关系和新的jar名称;