我尝试在Maven中使用以下依赖项:
<dependency>
<groupId>org.postgresql</groupId>
<artifactId>postgresql</artifactId>
<version>9.4-1200-jdbc4</version>
</dependency>
当我在main方法中使用此驱动程序时,它可以工作,但是当我安装模块并尝试运行.jar文件时,会发生ClassNotFoundException。我该怎么办?
我通过Class.forName(&#34; org.postgresql.Driver&#34;)在运行时调用驱动程序。我试图根据运行时改变范围,但它没有帮助。
我的堆栈跟踪:
java.lang.ClassNotFoundException: org.postgresql.Driver
at java.net.URLClassLoader$1.run(URLClassLoader.java:366)
at java.net.URLClassLoader$1.run(URLClassLoader.java:355)
at java.security.AccessController.doPrivileged(Native Method)
at java.net.URLClassLoader.findClass(URLClassLoader.java:354)
at java.lang.ClassLoader.loadClass(ClassLoader.java:425)
at sun.misc.Launcher$AppClassLoader.loadClass(Launcher.java:308)
at java.lang.ClassLoader.loadClass(ClassLoader.java:358)
at java.lang.Class.forName0(Native Method)
at java.lang.Class.forName(Class.java:191)
at dbchecker.CountDBChecker.openConnection(CountDBChecker.java:149)
at dbchecker.CountDBChecker.main(CountDBChecker.java:165)
at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:57)
at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
at java.lang.reflect.Method.invoke(Method.java:606)
at com.intellij.rt.execution.application.AppMain.main(AppMain.java:140)
我使用jar命令java -jar和iPOJO(如this教程)。
我解决了maven-assembly-plugin执行jar的问题,但是我和iPOJO有另一个连接问题。 iPOJO不执行jar,似乎缺少清单文件中的某些指令。以前的清单:
Manifest-Version: 1.0
Export-Package: dbchecker;uses:="common,checker.service";version="1.0.
0"
iPOJO-Components: instance { $component="dbchecker.CountDBChecker" }co
mponent { $name="dbchecker.CountDBChecker" $classname="dbchecker.Coun
tDBChecker" provides { }manipulation { $classname="dbchecker.CountDBC
hecker" interface { $name="checker.service.CheckerService" }field { $
name="connection" $type="java.sql.Connection" }field { $name="dateCol
umn" $type="java.lang.String" }field { $name="dateFrom" $type="java.l
ang.String" }field { $name="dateTo" $type="java.lang.String" }field {
$name="interval" $type="long" }field { $name="maxRequired" $type="lo
ng" }field { $name="minRequired" $type="long" }field { $name="report"
$type="common.Report" }field { $name="send" $type="boolean" }field {
$name="table" $type="java.lang.String" }field { $name="zdegeokodowan
o" $type="common.Zdegeokodowano" }field { $name="zdegeokodowanoColumn
" $type="java.lang.String" }method { $name="$init" }method { $name="g
etInterval" $return="long" }method { $name="check" $return="common.Re
port" }method { $name="buildCountQuery" $return="java.lang.String" }m
ethod { $name="executeCountQuery" $return="long" $arguments="{java.la
ng.String}" $names="{query}" }method { $name="setMessage" $return="ja
va.lang.String" $arguments="{long,java.lang.String}" $names="{result}
" }method { $name="setErrorMessage" $return="java.lang.String" $argum
ents="{long,java.lang.String,long,boolean}" $names="{result,query,req
uired}" }method { $name="reportErrorMessage" $arguments="{long,java.l
ang.String,long,boolean}" $names="{result,query,required}" }method {
$name="openConnection" $return="java.sql.Connection" }}}
Bundle-Version: 1.0.0
Built-By: mk
Build-Jdk: 1.7.0_79
Tool: Bnd-1.50.0
Bundle-Name: countDBChecker
Bnd-LastModified: 1442913271587
Created-By: Apache Maven Bundle Plugin & iPOJO 1.12.1
Bundle-ManifestVersion: 2
Import-Package: org.osgi.service.log;version=1.3, common;version="[1.0
,2)", org.apache.felix.ipojo.architecture;version="[1.12.1,2.0.0)", c
hecker.service;version="[1.0,2)", org.apache.felix.ipojo;version="[1.
12.1,2.0.0)", org.osgi.service.cm;version=1.2
Bundle-SymbolicName: supervisor.countDBChecker
最近的清单:
Manifest-Version: 1.0
Created-By: 24.79-b02 (Oracle Corporation)
Archiver-Version: Plexus Archiver
我应该更改pom.xml中的执行目标吗?这是pom(部分):
<plugin>
<groupId>org.apache.felix</groupId>
<artifactId>maven-ipojo-plugin</artifactId>
<executions>
<execution>
<goals>
<goal>ipojo-bundle</goal>
</goals>
</execution>
</executions>
</plugin>
<plugin>
<artifactId>maven-assembly-plugin</artifactId>
<version>2.4</version>
<configuration>
<descriptorRefs>
<descriptorRef>jar-with-dependencies</descriptorRef>
</descriptorRefs>
</configuration>
<executions>
<execution>
<id>make-assembly</id>
<phase>install</phase>
<goals>
<goal>single</goal>
</goals>
</execution>
</executions>
</plugin>
答案 0 :(得分:1)
看起来您的JAR不包含PostgreSQL JDBC驱动程序类。只需在运行应用程序时指定JAR的类路径,例如:
java -cp postgres-jdbc.jar:myApp.jar mypackage.MyMainClass
或者使用maven-assembly-plugin构建独立的JAR,包括PostgreSQL依赖项。
答案 1 :(得分:0)
当您运行.jar文件时 - 依赖库应该由您自己构建(它们不会被打包到您的jar文件中)。
因此,您应该在运行.jar文件的类路径中为此依赖项提供jar,即您应该: