在Java[Maven]项目中访问资源

4

请有人一次性解释如何正确访问诸如DATABASEHTML文件等资源。

假设我的Maven JavaFX项目看起来像这样(请检查图片)。

http://s30.postimg.org/lacoynzv5/image.png

它有它的

src/main/java

src/main/resources

在构建路径中

Build path

在我的资源文件夹中,有一个带有数据库的文件夹和一个带有HTML文件的文件夹。
这是我访问数据库的方式,在IDE中运行时可以正常工作,但在打包或运行mvn native后的.exe文件中无法正常工作。
Class.forName("org.sqlite.JDBC");
c = DriverManager.getConnection("jdbc:sqlite:src/main/resources/DB/SeeYourUse.sqlite");

这是我如何访问我的HTML文件以在WebView中使用它

String url = Main.class.getResource("/HTML/help.html").toExternalForm();  
webEngine.load(url);

这个在IDE中是可以工作的(使用jfx:run或者以Java应用程序方式运行),但是在部署后没有机会运行它。

以下是我运行并记录日志时出现的错误信息。

java.sql.SQLException: path to 'src/main/resources/DB/SeeYourUse.sqlite': 'E:\Programming\Java\Work\SeeYourUse\target\jfx\native\SeeYourUse-0.0.1-SNAPSHOT\app\src' does not exist

问题是: 如何正确加载数据库和HTML,以便能够最大限度地使用它?
1个回答

2

src/main/resources会被直接复制到你的jar文件中,target/classes也是一样。你可以通过class.getResource(String name)访问资源并返回URL,也可以使用Class.getResourceAsStream(String name)打开流来获取资源。但是,在数据库这种特殊情况下,我不建议将资源放在jar文件中,因为jdbc驱动程序会直接从文件系统加载数据库文件。你应该通过打开流并将其写入外部目录来提取数据库,至少如果它不存在的话。

至于html文件,你可以检索URL以获取静态资源,并像上面所述直接使用它们。但是请注意,除非你能替换它用于查找其他资源的逻辑,否则web引擎将无法使用从html文件引用的其他资源。在这种情况下,我甚至会将html文件及其所有依赖项提取到一个临时位置。


1
我说的内容也适用于扁平的目录结构,不一定需要打包成jar文件。 - Michał Zegan
1
部署后,您的资源与类通常位于同一目录中,这通常被打包成一个jar文件,不是吗? - Michał Zegan
1
很遗憾,但你可以尝试阅读关于javapackager的内容。我相信你的资源将会像我说的那样被打包。如果你将当前应用程序的jar文件移动到maven项目结构之外的地方,我保证它不会作为Java应用程序工作。但是HTML应该能够正确加载,而且你也没有抱怨HTML无法加载,对吧? - Michał Zegan
1
使用Class.getResourceAsStream()打开数据库文件,如果您的数据库不需要被修改,则将其写入临时目录,否则将其写入永久数据目录,例如用户主目录中的.myprogramname。然后,如果已经存在,则不需要再次提取。 - Michał Zegan
1
它知道HTML加载的位置,因此我认为它也应该能够解析相对路径。如果不能,我不是JavaFX开发人员,无法为您提供更多帮助。 - Michał Zegan
显示剩余23条评论

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接