Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/spring-boot/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 无法从spring boot.jar读取文件_Java_Spring Boot_Path_Resources - Fatal编程技术网

Java 无法从spring boot.jar读取文件

Java 无法从spring boot.jar读取文件,java,spring-boot,path,resources,Java,Spring Boot,Path,Resources,我想访问生产服务器上jar中名为reports/invoiceSweetChoice.jasper的类路径上的文件。无论我做什么,我都会得到空值 我尝试了this.getClass().getResourceAsStream(“reports/invoiceSweetChoice.jasper”),尝试了通过InputStream等。我已经打印了System.getProperty(“java.class.path”)的内容,它是空的。不知道怎么可能。您对如何解决这个问题有什么建议吗?在mani

我想访问生产服务器上jar中名为
reports/invoiceSweetChoice.jasper
的类路径上的文件。无论我做什么,我都会得到空值


我尝试了
this.getClass().getResourceAsStream(“reports/invoiceSweetChoice.jasper”)
,尝试了通过
InputStream
等。我已经打印了
System.getProperty(“java.class.path”)的内容,它是空的。不知道怎么可能。您对如何解决这个问题有什么建议吗?

在manifest.mf中,类路径是使用定义的,如下所示:

@Autowired private ResourceLoader resLoad;


void someMethod() {
    Resource r = resLoad.getResource("classpath:reports/file.abc");
    r.getInputStream()...
    ...
文件根目录下的MANIFEST.MF

Class-Path: hd1.jar path/to/label007.jar path/to/foo.jar
如果jar文件名中有空格,则应将其括在引号中

如果它是一个webapp,那么reports路径应该在类路径的BOOT-INF子目录中——如果您将它放在标准布局的src/main/resources中,这将由maven自动执行

编辑:

现在,您已经明确了要做什么,您有两种方法。正如我上面所说,您可以从webapp的BOOT-INF子目录中获取该文件,也可以枚举jar中的条目,直到找到所需的条目:

JarInputStream is = new JarInputStream(new FileInputStream("your/jar/file.jar"));
JarEntry obj = null
while ((obj = is.getNextJarEntry()) != null) {
   JarEntry entry = (JarEntry)obj;
   if (entry.getName().equals("file.abc")) {
        ByteArrayOutputStream baos = new ByetArrayOutputStream(); 
        IOUtils.copy(jarFile.getInputStream(entry), baos);
        String contents = new String(baos.toByteArray(), "utf-8");
        // your entry is now read into contents
   }
}

对于罐子来说,情况似乎有所不同。这有帮助吗(第5节)?在jar的manifest.mf中,您的类路径是什么?看看spring接口。你可以自动连线。您可能希望将该文件放在src/main/resources目录中。@希望有一个文件位于src/main/resources/reports/文件夹中。你能解释一下你对ResourceLoader类的想法吗?@hd1清单没有这些信息。如何定义它?我得到了java.lang.NullPointerException。我已经检查过了,我在文件夹中得到了我的文件。jar中是否存在包含该文件的reports目录?应该在BOOT-INF/classes/Yes中,就在那里。这是一个网络应用,如果这很重要的话。我用java-jar jarFile.jar运行它。我是否缺少一些奇怪的服务器配置?我在我们的spring boot jar中找不到任何特定的配置来让它工作。我们的清单中没有类路径。您正在运行哪个版本的spring boot?这是在从其他jar读取时发生的?但是这个文件在我正在运行的jar中。如果jar名为test.jar,那么即使MANIFEST.MF和我要读取的文件在该jar中,我也需要添加类路径:test.jar吗?仅当它们在外部jar中时。如果类包含在jar中,则不需要。如果它在嵌入式jar中,您将需要一个自定义类加载器。嗯…我需要一个自定义类加载器?怎么做?为什么我需要它,为什么它不能正常加载?哪个罐子?您正在运行的那个,或者它是嵌入在jar中的?文件在我正在运行的jar中。