【问题标题】:How to correctly import files in a maven project structure?如何在 Maven 项目结构中正确导入文件?
【发布时间】:2014-11-07 12:28:38
【问题描述】:

我有一个 xml 格式的配置文件,我需要将其加载到我的 java 代码中。在测试时,我通过它的绝对 URL 导入它,但现在我将项目编译和部署为一个 jar,这将不再起作用。

根据以前的经验,我认为正确的方法是使用 ClassLoader,但我遇到了一些困难。也许是因为我的项目设置,我不知道。我想我可以完成这项工作,就像我过去所做的那样,但我真的想确保我以标准、传统和/或正确的方式来做,这样我就不需要每次都进行实验这出现了。

这是我尝试实现的代码:http://www.mkyong.com/java/java-read-a-file-from-resources-folder/

但是,这段代码:

ClassLoader classLoader = getClass().getClassLoader();
File file = new File(classLoader.getResource("file/test.xml").getFile());

由于需要抽象类的静态方法中的文件,我无法使用。因此,我使用以下代码将其关闭:

ClassLoader classLoader = XmlConfigLoader.class.getClassLoader();
File file = new File(classLoader.getResource("configuration.xml").getFile());

XmlConfigLoader 是包含类。 "configuration.xml" 位于 src/main/resources 文件夹中,就像示例中的 "file/test.xml" 一样

我在调试模式下运行代码,发现file 路径错误。它不是查看src/main/resources,而是指向target/classes

  1. 我需要设置默认资源文件夹的设置选项吗?
  2. src/main/resources 是存储此类文件的常规位置吗?
  3. 在此设置中我加载 ClassLoader 的方式是否正确?

作为附加信息,这是一个 Maven 项目。

更新:

我当前的代码实际上运行良好,除了一个错误。该文件在编译时自动传输到target/classes 文件夹。但是,url 中的空格被%20 替换,我必须手动将它们改回来才能让系统找到该文件。我确信有更好的解决方案。有人吗?

【问题讨论】:

    标签: java file maven resources classloader


    【解决方案1】:

    文件具有路径“target/classes”是有道理的,因为这是您的 jar 清单文件中的 Class-Path。如果您想让它在其他地方查看,请编辑清单文件并将资源类路径附加到它。

    Setting classpath for a JAR 有更多关于如何更改 jar 类路径的详细信息

    在你使用maven的时候,最简单的做法就是把你的资源文件放到src/main/resources/META-INF目录下,maven会帮你整理的。见http://maven.apache.org/guides/getting-started/index.html#How_do_I_add_resources_to_my_JAR

    【讨论】:

    • 据我所知,进入目标文件夹的所有内容都是编译代码,对吧?所以我不应该手动向目标文件夹添加一些东西,或者?我知道文件可能在其他地方,当我编译和运行代码时,与它在我的开发环境中的位置相比,但正如我在我的问题中所说,我不是在寻找更多可能的选项,我正在寻找我的问题的常规标准解决方案。所以我可能想调整清单文件,如果这是标准的做法。是吗?
    • 目标文件夹,在我看来,是你放置你想要在目标系统上结束的东西的地方(在这种情况下,你的 jar 文件),所以我会毫不犹豫地创建一个目标/resources 目录用于此目的。但是,由于您使用的是 maven,最简单的做法是将您的资源文件放入 src/main/resources/META-INF 目录,maven 会为您整理。见maven.apache.org/guides/getting-started/…
    • ...作为旁注,我现在可以看到我的 configuration.xml 文件实际上已自动传输到目标/类。只有它没有在eclipse中显示。显然系统确实找到了该文件,但不知何故它没有读取它......我会进一步调查......到目前为止,我还没有手动将任何东西放入我的目标中。当 maven 执行它的编译操作时,jar 被生成并放置到该文件夹​​中。
    • 我更新了我的答案以包含我之前评论的内容
    • 我在问题中的原始解决方案实际上有效,除了一件事:文件路径包含一个带有空格字符的文件夹,它被替换为%20。我手动将它们格式化回空格,瞧!但这不可能是这样做的预期方式???
    猜你喜欢
    • 2013-06-03
    • 2020-09-18
    • 2023-03-10
    • 2012-10-18
    • 2013-03-03
    • 2018-03-07
    • 1970-01-01
    • 2021-11-06
    • 2019-01-22
    相关资源
    最近更新 更多