使用maven的postgresql驱动程序

时间:2015-09-21 13:57:00

标签: java postgresql maven jdbc jar

我尝试在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>

2 个答案:

答案 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,即您应该:

  • 提供正确的清单文件,将此依赖项的jar作为类路径的一部分,或者为依赖性jar提供类路径作为命令行的一部分
  • 将此依赖项的jar复制到目标文件夹