为什么从生成的jar中找不到jdbc驱动程序?

时间:2018-05-04 14:30:11

标签: java eclipse postgresql maven jdbc

我有一个工作正常的JAVA SE项目。当我尝试在外部使用它作为一个罐子时会出现问题。

我正在使用Eclipse Oxygen。正如你在我的pom中看到的,我的JAVA SE项目使用JDBC4.2。 Oracle doc州:

  

"在以前的JDBC版本中,为了获得连接,您首先得到了   通过调用方法Class.forName来初始化JDBC驱动程序。"

此外:

  

在类路径中找到的任何JDBC 4.0驱动程序都是   自动加载。 (但是,您必须手动加载任何驱动程序   在JDBC 4.0之前使用方法Class.forName。)

因此,我不需要在DBConnection类中编写Class.forname(...)(见下文)。

当我在项目中使用DBConnection时,它可以正常工作,但是,如果我创建一个jar并尝试在另一个项目中导入它,我会得到以下异常:"没有为jdbc找到合适的驱动程序:postgresql: //主机:端口/ DBNAME&#34 ;.以下是我创建jar的步骤:

  1. mvn clean install
  2. 在新的空清洁工作区中创建新的Java项目(TestProject)
  3. 使用main
  4. 创建一个测试类
  5. 调用一个使用主
  6. 中的DBConnection的类
  7. 我没有编译问题(jar中的所有类都已正确加载)
  8. 当我运行main时," getConnection"我的DBConnection类抛出以下异常:"没有为jdbc找到合适的驱动程序:postgresql:// host:port / dbName"
  9. 如果我右键单击TestProject-> configure - >转换为maven项目,然后添加postgres驱动程序依赖项,一切正常!!!
  10. 我的jar中是不是已经存在PostgreSQL驱动程序了?为什么要将它添加到用户项目的依赖项中?

    以下是DBConnection类的代码:

    package generic.util;
    
    import java.io.IOException;
    import java.sql.Connection;
    import java.sql.DriverManager;
    import java.sql.SQLException;
    import java.util.Properties;
    
    public class DBConnection {
    
        private static final String FILE_NAME = "db";
        private static final String URL = "url";
        private static final String USER = "user";
        private static final String PASSWORD = "password";
    
        private static Connection conn;
    
        private DBConnection(){
    
        }
    
        public static synchronized Connection getConnection() throws SQLException, ClassNotFoundException, IOException {
    
            if(DBConnection.conn == null || DBConnection.conn.isClosed()){
                Properties props = PropertiesReader.readPropertyFile(FILE_NAME);
    
                String url = props.getProperty(URL);
                String user = props.getProperty(USER);
                String password = props.getProperty(PASSWORD);
    
                Connection conn = DriverManager.getConnection(url, user, password);
    
                DBConnection.conn = conn;
            }
    
            return DBConnection.conn;
        }
    
    }
    

    以下是我的pom:

    <project xmlns="http://maven.apache.org/POM/4.0.0"
        xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
        xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
        <modelVersion>4.0.0</modelVersion>
        <groupId>groupid</groupId>
        <artifactId>artifactid</artifactId>
        <version>1.0</version>
        <properties>
            <skipTests>true</skipTests>
        </properties>
        <build>
            <plugins>
                <plugin>
                    <groupId>org.apache.maven.plugins</groupId>
                    <artifactId>maven-compiler-plugin</artifactId>
                    <version>3.7.0</version>
                    <configuration>
                        <source>1.8</source>
                        <target>1.8</target>
                    </configuration>
                </plugin>
                <plugin>
                    <groupId>org.apache.maven.plugins</groupId>
                    <artifactId>maven-surefire-plugin</artifactId>
                    <version>2.12.4</version>
                    <configuration>
                        <skipTests>${skipTests}</skipTests>
                    </configuration>
                </plugin>
            </plugins>
        </build>
        <dependencies>
    
            <!-- https://mvnrepository.com/artifact/org.postgresql/postgresql -->
            <dependency>
                <groupId>org.postgresql</groupId>
                <artifactId>postgresql</artifactId>
                <version>42.2.2</version>
            </dependency>
    
        </dependencies>
    </project>
    

1 个答案:

答案 0 :(得分:3)

默认行为不会将dependend库重新打包到创建的工件中。通常,外部库不会像软件那样经常更改,并且将部署到应用程序服务器。

使用微服务,例如spring-boot这已经改变,你可以部署一个包含所有依赖项的.jar文件(包括tomcat)。

您有两种选择:

  • 将所有库放在lib文件夹中,并将其添加到类路径中。
  • Create a fat jar