我看到了很多关于同一主题的问题,但老实说,经过几个小时的调试后,没有任何效果。 我有一个带有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 和外部库列表中时,为什么它不会自动成为类路径的一部分?
我找到了解决办法。根据评论和错误本身,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
通常从 IntellijIdea 重新加载 Gradle / Maven 可以解决问题。