在macOS的“扩展”文件夹中找不到JDBC驱动程序

tl; dr

我的简单Java 13应用程序在macOS上找不到放置在.jar文件夹中的JDBC驱动程序/library/Java/Extensions,除非我在类路径中明确包含了它。

适用于macOS的Java上的

Extensions文件夹

据我了解,对于macOS Mojave上来自AdoptOpenJDK.net的Java 13.0.1,放入/library/Java/Extensions文件夹中的JAR文件应该自动放在classpath上。

所以我将JDBC driverPostgres放到了该文件夹/library/Java/Extensions/postgresql-42.2.8.jar中。

当我以这种方式运行tryjdbc应用时:

java -classpath tryjdbc.jar work.basil.example.App

...我发现找不到Postgres DataSource实现类PGSimpleDataSource的错误很多。

  

线程“ main”中的异常java.lang.NoClassDefFoundError:org / postgresql / ds / PGSimpleDataSource

如果通过在Extensions文件夹中明确包含JDBC驱动程序来运行同一应用程序,则该错误会消失。我使用冒号:字符将/library/Java/Extensions/postgresql-42.2.8.jar添加到类路径中。

java -classpath tryjdbc.jar:/library/Java/Extensions/postgresql-42.2.8.jar work.basil.example.App

➥我是否误解了macOS上Java中Extensions文件夹的用途?

➥JDBC驱动程序是否存在某些特殊问题,也许是某种类加载器问题?


我认为这无关紧要,但这是我的一个非常简单的应用程序,试图在同一主机上本地连接数据库。

package work.basil.example;

import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.time.LocalDate;
import java.util.Objects;

public class App
{
    public static void main ( String[] args )
    {
        App app = new App();
        app.doIt();
    }

    private void doIt ( )
    {
        System.out.println( "Hello World!" );

        org.postgresql.ds.PGSimpleDataSource dataSource = new org.postgresql.ds.PGSimpleDataSource();

        dataSource.setUser( "postgres" );
        dataSource.setPassword( "mot-de-passe-db7!" );

        System.out.println( "BASIL - Attempting to connect to database: " );
        if ( Objects.nonNull( dataSource ) )
        {
            String sql = "SELECT CURRENT_DATE ;";
            try (
                    Connection conn = dataSource.getconnection() ;
                    PreparedStatement ps = conn.prepareStatement( sql ) ;
            )
            {
                try (
                        ResultSet rs = ps.executeQuery() ;
                )
                {
                    if ( rs.next() )
                    {
                        LocalDate ld = rs.getObject( 1,LocalDate.class );
                        System.out.println( "BASIL - date is " + ld );
                    }
                }
            }
            catch ( SQLException e )
            {
                e.printStackTrace();
            }
        }

        System.out.println( "BASIL - all done." );
    }
}

输出:

  

Hello World!

     

BASIL-尝试连接到数据库:

     

巴西勒-日期为2019-11-09

     

巴西勒-全部完成。

lxbagglo 回答:在macOS的“扩展”文件夹中找不到JDBC驱动程序

暂时没有好的解决方案,如果你有好的解决方案,请发邮件至:iooj@foxmail.com
本文链接:https://www.f2er.com/3131556.html

大家都在问