【发布时间】: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 和列表中时不会自动成为类路径的一部分?
-
该类不在您的类路径中。
-
我试过这个,但没有用: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