我的简单Java 13应用程序在macOS上找不到放置在.jar
文件夹中的JDBC驱动程序/Library/Java/Extensions
,除非我在类路径中明确包含了它。
Extensions
文件夹据我了解,对于macOS Mojave上来自AdoptOpenJDK.net的Java 13.0.1,放入/Library/Java/Extensions
文件夹中的JAR文件应该自动放在classpath上。
所以我将JDBC driver的Postgres放到了该文件夹/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
巴西勒-全部完成。