【问题标题】:java.lang.ClassNotFoundException: org.postgresql.Driver in Terminaljava.lang.ClassNotFoundException:终端中的 org.postgresql.Driver
【发布时间】:2022-08-19 08:01:09
【问题描述】:

我已经看到很多关于同一主题的问题,但老实说,经过几个小时的调试,没有任何效果。 我有一个带有 maven 的 java 项目,它调用 postgres DB 来读取和写入数据。代码在 IntelliJ 上构建并运行良好。我正在尝试在终端上运行它(以便我可以使用确定有效的命令并将其用于我的 dockerfile)。 对于编译:

$mvn clean install

对于运行:

$java -jar target/posthogdata-1.0-SNAPSHOT.jar  

我看到以下错误:

java.lang.ClassNotFoundException: org.postgresql.Driver
    at java.base/jdk.internal.loader.BuiltinClassLoader.loadClass(BuiltinClassLoader.java:641)
    at java.base/jdk.internal.loader.ClassLoaders$AppClassLoader.loadClass(ClassLoaders.java:188)
    at java.base/java.lang.ClassLoader.loadClass(ClassLoader.java:521)
    at java.base/java.lang.Class.forName0(Native Method)
    at java.base/java.lang.Class.forName(Class.java:383)
    at java.base/java.lang.Class.forName(Class.java:376)
    at luminai.data.PostgresClient.createConnection(PostgresClient.java:19)
    at luminai.data.DataProcessor.main(DataProcessor.java:38)

代码在这一行中断:

Class.forName(\"org.postgresql.Driver\");

我对此时的问题感到困惑。我有正确的依赖:

<dependency>
   <groupId>org.postgresql</groupId>
   <artifactId>postgresql</artifactId>
   <version>42.3.1</version>
</dependency>

这是我的插件:

<build>
    <plugins>
        <plugin>
            <!-- Build an executable JAR -->
            <groupId>org.apache.maven.plugins</groupId>
            <artifactId>maven-jar-plugin</artifactId>
            <version>3.1.0</version>
            <configuration>
                <archive>
                   <manifest>
                      <addClasspath>true</addClasspath>
                      <classpathPrefix>lib/</classpathPrefix>
                      <mainClass>luminai.data.DataProcessor</mainClass>
                   </manifest>
                </archive>
            </configuration>
        </plugin>
    </plugins>
</build>

编辑:

我尝试过的命令:

$java -classpath org.postgresql:postgresql:42.3.1 -jar target/posthogdata-1.0-SNAPSHOT.jar

$java -classpath org.postgresql:postgresql:42.3.1:* -jar target/posthogdata-1.0-SNAPSHOT.jar

$java -cp .:org.postgresql:postgresql:42.3.1 -jar target/posthogdata-1.0-SNAPSHOT.jar

为什么 postgres jar 在外部库的 pom 和列表中时不会自动成为类路径的一部分?

这是我的项目的结构,我从 >posthogdata 运行命令

  • 该类不在您的类路径中。
  • 我试过这个,但没有用:java -classpath org.postgresql:postgresql:42.3.1 -jar target/posthogdata-1.0-SNAPSHOT.jar
  • 对我来说,这看起来不像-cp 的正确用法。从Java spec 使用-cp 或-classpath 如下-cp classpath Specifies a list of directories, JAR files, and ZIP archives to search for class files. Separate class path entries with semicolons (;). Specifying -classpath or -cp overrides any setting of the CLASSPATH environment variable. 你真的有一个名为org.postgresql:postgresql:42.3.1 的文件吗?如果是这样,那么它相对于运行命令的位置不在正确的位置。
  • @sorifiend 我在 pom 中有 org.postgresql:postgresql:42.3.1 jar,因此在外部库中。我不明白为什么这不是自动类路径的一部分。
  • JAR 文件的名称是postgresql-jdbc-42.3.1.jar,所以爪哇命令应该是:java -cp postgresql-jdbc-42.3.1.jar (假设 JAR 文件位于您发出命令的同一目录中)

标签: java postgresql maven


【解决方案1】:

我找到了解决办法。根据 cmets 和错误本身,Postgres 驱动程序 jar 不在类路径中。经过某些尝试,我更改了我的 pom 插件,以将我的项目的 jar 合并到其中的所有其他依赖 jar 的方式。我猜 IntelliJ 是开箱即用的。

将插件更改为:

    <build>
        <plugins>
            <plugin>
                <artifactId>maven-assembly-plugin</artifactId>
                <configuration>
                    <archive>
                        <manifest>
                            <mainClass>luminai.data.Main</mainClass>
                        </manifest>
                    </archive>
                    <descriptorRefs>
                        <descriptorRef>jar-with-dependencies</descriptorRef>
                    </descriptorRefs>
                </configuration>
            </plugin>
        </plugins>
    </build>

并运行以下命令:

$ mvn clean compile assembly:single
$ java -jar target/posthogdata-1.0-SNAPSHOT-jar-with-dependencies.jar

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2015-07-19
    • 1970-01-01
    • 2023-01-17
    • 2020-10-06
    • 2021-10-01
    • 1970-01-01
    • 2023-03-17
    • 2023-03-21
    相关资源
    最近更新 更多