- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
当应用程序打包到 jar 中时,我需要从应用程序的根目录中获取资源。我的项目是这样的:
ProjectRoot
resource.txt //want to access from here
src
main
java
package1
package2
package3
Main.java
target
app.jar
classes
resource.txt //works when here
package1
package2
package3
Main.class
我使用这个代码:
Path path = Paths.get("resource.txt");
当在打包成 jar 之前运行时,它发现文件很好(在 ProjectRoot 内)。运行jar时,找不到它,并将此路径转换为target/resource.txt
。
这段代码:
BufferedReader br = new BufferedReader(new InputStreamReader(new Main().getClass().getClassLoader().getResourceAsStream(
"resource.txt")));
在打包之前运行时,会查找 target/classes
中的资源。打包后,它声称从 .../target/app.jar!/resource.txt
获取资源。
这段代码:
BufferedReader br = new BufferedReader(new InputStreamReader(new Main().getClass().getClassLoader().getResourceAsStream(
"/resource.txt")));
我无法理解在哪里寻找资源,但它似乎不是 ProjectRoot
。
我想要做的就是将资源放入 ProjectRoot
中,并能够从外部 jar(从 IDE 运行类文件时)和内部(将文件打包到使用 Maven 的 jar 文件)。
编辑:我需要该代码可以用于打包前和打包后。含义:如果我从 IDE 内部运行 Main.java,它将获取资源;如果我将所有内容打包到 JAR 中并运行 JAR,它将获得资源 - 全部使用相同的代码。
最佳答案
Maven 使用名为 Standard Directory Layout 的东西。如果您不遵循此布局,则插件将无法正确完成其工作。从技术上讲,您可以将 Maven 配置为使用不同的目录,但 99.999% 的情况下这是不必要的。
此布局的特点之一是生产文件进入:
<project-dir>/src/main/java
*.java
文件<project-dir>/src/main/resources
*.java
文件(即资源)当您构建项目时,Java 源文件将被编译并生成 *.class
文件被放入 target/classes
目录;这是由 maven-compiler-plugin
完成的。同时,资源文件是从src/main/resources
复制的。进入target/classes
以及; maven-resources-plugin
对此负责。
注意:请参阅 Introduction to the Build Lifecycle有关阶段以及哪个阶段执行哪些插件的更多信息。这个Stack Overflow question可能也有用。
当您从 IDE 启动应用程序时(可能通过 exec-maven-plugin
)target/classes
目录放在类路径上。这意味着 src/main/java
中的所有编译类。以及从 src/main/resources
复制的所有资源可以通过类路径使用。
然后,当您将应用程序打包到 JAR 文件中时, target/classes
中的所有文件添加到生成的 JAR 文件中(由 maven-jar-plugin
处理)。 这包括从 src/main/resources
复制的资源。当您使用此 JAR 文件启动应用程序时,资源仍然可以通过类路径使用,因为它们嵌入在 JAR 文件中。
制作 resource.txt
在类路径上可用,只需移动:
<project-dir>/resource.txt
致:
<project-dir>/src/main/resources/resource.txt.
然后你可以使用Class#getResource
与 /resource.txt
作为道路和一切都应该适合你。 URL
返回者 getResource
会有所不同,具体取决于您是否针对 target/classes
执行或针对 JAR 文件。
针对 target/classes
执行时你会得到类似的东西:
file:///.../<project-dir>/target/classes/resource.txt
当对 JAR 文件执行时,你会得到类似的结果:
jar:file:///.../<project-dir>/target/projectname-version.jar!/resource.txt
注意:这一切都假设 resource.txt
实际上应该是资源而不是外部文件。一旦部署在 JAR 文件中,资源通常是只读的;如果您需要可写文件,那么您可以使用该文件的指定位置(例如用户主目录中的文件夹)。通常通过 java.io.File
访问外部文件或java.nio.file.*
。请记住,资源与普通文件不同。
现在,如果你输入 resource.txt
直属<project-dir>
这对 Maven 来说毫无意义。它不会被复制到 target/classes
或者最终出现在 JAR 文件中,这意味着该资源在类路径上永远不可用。重申一下,所有资源都归 src/main/resources
管辖。 。
查看 java.lang.Class#getResource(String)
的 Javadoc有关路径的更多信息,例如何时使用前导 /
以及什么时候不可以。该链接指向 Java 12 的 Javadoc,其中包含有关资源和模块(JPMS/Jigsaw 模块,而不是 Maven 模块)的信息;如果您不使用模块,则可以忽略文档的该部分。
关于java - 从jar里面获取资源文件,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56779816/
我需要您在以下方面提供帮助。近一个月来,我一直在阅读有关任务和异步的内容。 我想尝试在一个简单的 wep api 项目中实现我新获得的知识。我有以下方法,并且它们都按预期工作: public Htt
我的可执行 jar 中有一个模板文件 (.xls)。不需要在运行时我需要为这个文件创建 100 多个副本(稍后将唯一地附加)。用于获取 jar 文件中的资源 (template.xls)。我正在使用
我在查看网站的模型代码时对原型(prototype)有疑问。我知道这对 Javascript 中的继承很有用。 在这个例子中... define([], function () { "use
影响我性能的前三项操作是: 获取滚动条 获取偏移高度 Ext.getStyle 为了解释我的应用程序中发生了什么:我有一个网格,其中有一列在每个单元格中呈现网格。当我几乎对网格的内容做任何事情时,它运
我正在使用以下函数来获取 URL 参数。 function gup(name, url) { name = name.replace(/[\[]/, '\\\[').replace(/[\]]/,
我最近一直在使用 sysctl 来做很多事情,现在我使用 HW_MACHINE_ARCH 变量。我正在使用以下代码。请注意,当我尝试获取其他变量 HW_MACHINE 时,此代码可以完美运行。我还认为
关闭。这个问题不符合Stack Overflow guidelines .它目前不接受答案。 关闭 9 年前。 要求提供代码的问题必须表现出对所解决问题的最低限度的理解。包括尝试过的解决方案、为什么
由于使用 main-bower-files 作为使用 Gulp 的编译任务的一部分,我无法使用 node_modules 中的 webpack 来require 模块code> dir 因为我会弄乱当
关闭。这个问题需要更多focused .它目前不接受答案。 想改进这个问题吗? 更新问题,使其只关注一个问题 editing this post . 关闭 5 年前。 Improve this qu
我使用 Gridlayout 在一行中放置 4 个元素。首先,我有一个 JPanel,一切正常。对于行数变大并且我必须能够向下滚动的情况,我对其进行了一些更改。现在我的 JPanel 上添加了一个 J
由于以下原因,我想将 VolumeId 的值保存在变量中: #!/usr/bin/env python import boto3 import json import argparse import
我正在将 MSAL 版本 1.x 更新为 MSAL-browser 的 Angular 。所以我正在尝试从版本 1.x 迁移到 2.X.I 能够成功替换代码并且工作正常。但是我遇到了 acquireT
我知道有很多关于此的问题,例如 Getting daily averages with pandas和 How get monthly mean in pandas using groupby但我遇到
This is the query string that I am receiving in URL. Output url: /demo/analysis/test?startDate=Sat+
我正在尝试使用 javascript 中的以下代码访问 Geoserver 层 var gkvrtWmsSource =new ol.source.ImageWMS({ u
API 需要一个包含授权代码的 header 。这就是我到目前为止所拥有的: var fullUrl = 'https://api.ecobee.com/1/thermostat?json=\{"s
如何获取文件中的最后一个字符,如果是某个字符,则删除它而不将整个文件加载到内存中? 这就是我目前所拥有的。 using (var fileStream = new FileStream("file.t
我是这个社区的新手,想出了我的第一个问题。 我正在使用 JSP,我成功地创建了 JSP-Sites,它正在使用jsp:setParameter 和 jsp:getParameter 具有单个字符串。
在回答 StoreStore reordering happens when compiling C++ for x86 @Peter Cordes 写过 For Acquire/Release se
我有一个函数,我们将其命名为 X1,它返回变量 Y。该函数在操作 .on("focusout", X1) 中使用。如何获取变量Y?执行.on后X1的结果? 最佳答案 您可以更改 Y 的范围以使其位于函
我是一名优秀的程序员,十分优秀!