当前位置: 首页 > 知识库问答 >
问题:

java.nio.file.NoSuchFileExc0019: Uber Jar无法定位src/main/Resources文件夹文件

房学
2023-03-14

我正在使用gradle构建uber jar,我使用的插件https://github.com/johnrengelman/shadow

我在src/main/resources文件夹中有一个json文件,我在下面的代码中使用它

   public Repository<Product> initializeData() {
        ClassLoader classLoader = getClass().getClassLoader();
        File file = new File(classLoader.getResource("product.json").getFile());
        System.out.println(file.getAbsolutePath());
        Repository<Product> productRepository = new ProductRepository();
        return productRepository;
    }

当我运行uber Jar时,面临以下问题

$$ java -cp libs/checkout-service-1.0-SNAPSHOT.jar com.noths.runner.Runner
java.nio.file.NoSuchFileException: /home/gradle/checkout-service/file:/home/gradle/checkout-service/libs/checkout-service-1.0-SNAPSHOT.jar!/product.json
        at java.base/sun.nio.fs.UnixException.translateToIOException(UnixException.java:92)
        at java.base/sun.nio.fs.UnixException.rethrowAsIOException(UnixException.java:111)
        at java.base/sun.nio.fs.UnixException.rethrowAsIOException(UnixException.java:116)
        at java.base/sun.nio.fs.UnixFileSystemProvider.newByteChannel(UnixFileSystemProvider.java:219)
        at java.base/java.nio.file.Files.newByteChannel(Files.java:371)
        at java.base/java.nio.file.Files.newByteChannel(Files.java:422)
        at java.base/java.nio.file.Files.readAllBytes(Files.java:3206)
        at java.base/java.nio.file.Files.readString(Files.java:3284)
        at java.base/java.nio.file.Files.readString(Files.java:3243)
        at com.noths.runner.Utils.initializeData(Utils.java:21)
        at com.noths.runner.Runner.main(Runner.java:21)
Exception in thread "main" java.lang.NullPointerException
        at com.noths.promotions.ProductPromotion.apply(ProductPromotion.java:26)
        at com.noths.promotions.DefaultPromotionsRunner.setPromotionsChain(DefaultPromotionsRunner.java:21)
        at com.noths.checkout.CheckoutServiceImpl.checkout(CheckoutServiceImpl.java:27)
        at com.noths.runner.Runner.main(Runner.java:25)

我的build.gradle是这样的

// Shadow Plugin https://github.com/johnrengelman/shadow
plugins {
    id "com.github.johnrengelman.shadow" version "6.0.0"
    id 'java'
}

group 'com'
version '1.0-SNAPSHOT'

repositories {
    mavenCentral()
}

dependencies {
    testImplementation 'org.junit.jupiter:junit-jupiter-api:5.7.0'
    testRuntimeOnly 'org.junit.jupiter:junit-jupiter-engine:5.7.0'

    compileOnly 'org.projectlombok:lombok:1.18.20'
    annotationProcessor 'org.projectlombok:lombok:1.18.20'

    testCompileOnly 'org.projectlombok:lombok:1.18.20'
    testAnnotationProcessor 'org.projectlombok:lombok:1.18.20'

    implementation 'com.google.code.gson:gson:2.8.8'

}

test {
    useJUnitPlatform()
}

共有1个答案

丁立果
2023-03-14

除非文件系统中有类,否则无法通过File访问类路径。一旦文件在jar中,通过文件的访问就必须失败。

所以你应该做的是一个类加载器。getResource(…)或者一个getClass()。getResource(…)。如果返回null,则表示传递的字符串与类路径上的某个内容不匹配,您需要确定是否需要修复该字符串或jar文件。如果您获得了一些资源,那么直接打开流并读取数据。

另见https://docs.oracle.com/en/java/javase/11/docs/api/java.base/java/lang/Class.html#getResource(java.lang.String)https://docs.oracle.com/en/java/javase/11/docs/api/java.base/java/net/URL.html#openStream()

我不太愿意使用getClass()。getResourceAsStream(…)因为您保存了一个函数调用,但如果资源不存在,则无法给出正确的错误消息。

 类似资料:
  • Spring靴-1.4.1;IDE-IntelliJ 2016.3。EAP 我试图加载资源如下; 和 当我从IDE运行应用程序时,这两种方法都可以正常工作,但当我尝试将应用程序构建为war并将其部署到Tomcat上时,这两种方法都不起作用。 有人能帮我解决这个问题吗? 谢谢

  • 我有一个maven Spring项目,里面有文件。如何在SpringMVC控制器中读取它。 我正在使用 但是is.

  • 我有一个目录结构如下的maven模块,我想在中获取的路径 我使用进行了尝试,但它给出了一个空值。 无法获取资源的路径

  • null null WEB-INF 类 com... 图像 字体 JS CSS messages_en.properties 为什么maven将所有资源放在classes文件夹下?我的文件夹结构错了吗?

  • 我想问一下,如何在SpringBoot中将文件夹作为资源或文件加载。假设我有src/main/resources/testfolder,我想做如下事情: ^但这将失败,因为ResourceUtils只能加载实际文件(.txt、.csv等),不是文件夹。。提前非常感谢。。 编辑: 原因是我需要得到文件夹的绝对路径... folderpath应该是“/workspace/intellij/Projec

  • 我正在尝试访问src/main/Resources/XYZ/view文件夹中的xsd,其中XYZ/view文件夹是由我创建的,文件夹具有我需要进行xml验证的abc.xsd。 当我每次尝试访问xsd时,结果为null, 我试过了, 1) 2) 以及我为获取资源或类加载器等而进行的更多跟踪。 最后我得到了xsd, 文件文件 = 新文件(新类路径资源(“/src/main/resources/XYZ/