使用 getClassLoader().getResource() 加载 mmdb 文件会返回 null,尽管该文件存在于资源中

Posted

技术标签:

【中文标题】使用 getClassLoader().getResource() 加载 mmdb 文件会返回 null,尽管该文件存在于资源中【英文标题】:loading mmdb file using getClassLoader().getResource() returns null although the file exist in the resources 【发布时间】:2020-12-08 23:12:22 【问题描述】:

我有这段代码:

class GeoLocator
    public GeoLocator() throws IOException 
            final URL url = getClass().getClassLoader().getResource("GeoLite2-Country.mmdb");
            if (url == null) 
                throw new IOException("File not found!");
            
    

在我的主要课程中:

public class Main 
    public static void main(String[] args) 

        try 
            GeoLocator geoLocator = new GeoLocator();
         catch (IOException e) 
            e.printStackTrace();
        
    

我的目标是加载位于我项目资源中的 mmdb 文件。 当我运行 main 函数时,我捕获了一个异常:

java.io.IOException: File not found!
    at com.a.GeoLocator.<init>(GeoLocator.java:19)
    at com.a.Main.main(Main.java:11)

我的项目中的文件层次结构如下:

-main
    -java
        -com.a
            GeoLocator.java
            Main.java

    -resources
        GeoLite2-Country.mmdb


我尝试过使用绝对路径和相对路径运行代码,但没有成功。

我正在使用 IntelliJ

有什么关系吗?

【问题讨论】:

您可能需要将resourses 重命名为resources,这是Maven 期望在默认情况下查找资源的位置。 其实它被命名为resources 只是在帖子中写错了。我会在这里修正那个错字。 【参考方案1】:

缺少的是:

        <resources>
            <resource>
                <directory>src/main/resources</directory>
                <includes>
                    <include>**/GeoLite2-Country.mmdb</include>
                    <include>**/apache.log</include>
                </includes>
            </resource>
        </resources>

在 pom.xml 文件中

【讨论】:

以上是关于使用 getClassLoader().getResource() 加载 mmdb 文件会返回 null,尽管该文件存在于资源中的主要内容,如果未能解决你的问题,请参考以下文章

Java 获取资源文件路径

maven中获取resources目录路径

maven中获取resources目录路径

java中与根目录平行的目录下的文件如何加载?

this.getClass().getClassLoader().getResourceAsStream()和this.getClass().getClassLoader().getResource(

使用 getClassLoader().getResource() 加载 mmdb 文件会返回 null,尽管该文件存在于资源中