在 java class Tomcat Maven 内置的 Web 项目中无法访问资产文件夹
assets folder is not accessible in java class Tomcat Web Project Built in Maven
我试图在项目的不同位置创建资产文件夹,并且我在其中有 MS Access DB 文件。
我想使用 ucanaccess 驱动程序访问它。但它给出了找不到文件的异常。
数据库连接代码。
public static Statement getConnectionStatement(){
try {
Class.forName("net.ucanaccess.jdbc.UcanaccessDriver");
String url = "jdbc:ucanaccess://.\assets\BC190201004.accdb";
connection = DriverManager.getConnection(url);
return connection.createStatement(ResultSet.TYPE_SCROLL_INSENSITIVE,
ResultSet.CONCUR_UPDATABLE);
} catch (ClassNotFoundException | SQLException e) {
e.printStackTrace();
return null;
}
}
但是使用这段代码,它工作正常
String url = "jdbc:ucanaccess://C:\Users\kha33\NetBeansProjects\CS506-Assignment-3\src\main\webapp\WEB-INF\assets\BC190201004.accdb";
我试过把assets文件夹放到项目主文件夹下,java文件夹,webapp文件夹和WEB-INF文件夹下。
我也在 NetBeans 中尝试过 IDE。
您用来访问文件的路径 .\assets\BC190201004.accdb
是相对于 Tomcat 进程的工作目录的。这通常是 $CATALINA_BASE
,但可以是任何东西(尤其是在 IDE 下)。
你应该以更稳定的方式给出路径,例如通过使用 ServletContext#getRealPath()
:
public static Statement getConnectionStatement(ServletContext ctx){
...
final String realPath = ctx.getRealPath("/WEB-INF/assets/BC190201004.accdb");
final String url = "jdbc:ucanaccess://" + realPath;
...
}
显然,如果您的 Tomcat 不解压 WAR,这将失败。然而,这并不常见。
我试图在项目的不同位置创建资产文件夹,并且我在其中有 MS Access DB 文件。 我想使用 ucanaccess 驱动程序访问它。但它给出了找不到文件的异常。
数据库连接代码。
public static Statement getConnectionStatement(){
try {
Class.forName("net.ucanaccess.jdbc.UcanaccessDriver");
String url = "jdbc:ucanaccess://.\assets\BC190201004.accdb";
connection = DriverManager.getConnection(url);
return connection.createStatement(ResultSet.TYPE_SCROLL_INSENSITIVE,
ResultSet.CONCUR_UPDATABLE);
} catch (ClassNotFoundException | SQLException e) {
e.printStackTrace();
return null;
}
}
但是使用这段代码,它工作正常
String url = "jdbc:ucanaccess://C:\Users\kha33\NetBeansProjects\CS506-Assignment-3\src\main\webapp\WEB-INF\assets\BC190201004.accdb";
我试过把assets文件夹放到项目主文件夹下,java文件夹,webapp文件夹和WEB-INF文件夹下。
我也在 NetBeans 中尝试过 IDE。
您用来访问文件的路径 .\assets\BC190201004.accdb
是相对于 Tomcat 进程的工作目录的。这通常是 $CATALINA_BASE
,但可以是任何东西(尤其是在 IDE 下)。
你应该以更稳定的方式给出路径,例如通过使用 ServletContext#getRealPath()
:
public static Statement getConnectionStatement(ServletContext ctx){
...
final String realPath = ctx.getRealPath("/WEB-INF/assets/BC190201004.accdb");
final String url = "jdbc:ucanaccess://" + realPath;
...
}
显然,如果您的 Tomcat 不解压 WAR,这将失败。然而,这并不常见。