代码之家  ›  专栏  ›  技术社区  ›  Peter

为什么在生成的jar中找不到jdbc驱动程序?[副本]

  •  0
  • Peter  · 技术社区  · 6 年前

    我有一个运行良好的JAVA SE项目。当我尝试在外部将其用作罐子时,问题就出现了。

    我用的是Eclipse氧气。正如您在我的pom中看到的,我的JAVA SE项目使用JDBC4。2. Oracle doc 国家:

    “在以前版本的JDBC中,要获得连接,首先需要 通过调用方法类初始化JDBC驱动程序。forName。“”

    此外:

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

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

    当我在项目中使用DBConnection时,它工作正常,但是,如果我创建一个jar并尝试将其导入另一个项目中,我会遇到以下异常:“没有找到适合jdbc的驱动程序:postgresql://host:port/dbName“。以下是我创建jar的步骤:

    1. mvn清洁安装
    2. 在新的空的干净工作区中创建新的java项目(TestProject)
    3. 使用main创建测试类
    4. 从main调用使用DBConnection的类
    5. 我没有编译问题(jar中的所有类都已正确加载)
    6. 当我运行main时,DBConnection类的“getConnection”抛出以下异常:“没有找到适合jdbc的驱动程序:postgresql://host:port/dbName“”
    7. 如果 我右键单击TestProject->配置->转换为maven项目,然后添加postgres驱动程序依赖项, 一切都很好!!!

    PostgreSQL驱动程序不应该已经存在于我的jar中吗?为什么要将其添加到用户项目的依赖项中?

    以下是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 回复  |  直到 6 年前
        1
  •  3
  •   stacker    6 年前

    默认行为不会将依赖的库重新打包到创建的构件中。通常,外部库不会像您的软件那样频繁更改,而是部署到应用程序服务器上。

    使用微服务(如spring boot)后,情况发生了变化,您可以部署单个。jar文件包括所有依赖项(甚至包括tomcat)。

    您有两种选择: