【问题标题】:How to refer to a file present within src/main/resources folder deployed in a jboss env?如何引用部署在 jboss 环境中的 src/main/resources 文件夹中的文件?
【发布时间】:2019-01-12 15:50:35
【问题描述】:

我需要在 Web 应用程序的 src/main/resources 文件夹中查找图像。它是一个基于Apache CXF SAOP 的网络应用程序。

我们在 jboss env(jboss-eap-6.4) 中运行它

构建战争后,同样部署。

但是,我无法获得上述文件的正确路径。 请提出建议。

我尝试了多种选择。

File logo= new File("src/main/resources/image.jpg");    
logo.getAbsolutePath(); //  This works great when Junit tested, however breaks with the server. 

这也不起作用-

ClassLoader contextClassLoader = Thread.currentThread().getContextClassLoader();
contextClassLoader.getResource("image.jpg").getPath();

【问题讨论】:

  • 第一个与 JUnit 一起工作,因为您使用作为项目根目录的工作目录启动运行 JUnit 的 JVM,相对路径 src/... 确实指向正确的文件。一旦部署,在你的战争之外就不会有这样的文件,所以你需要使第二个选项起作用。确保 src/main/resources/ 目录存在于您的战争中并指定为类路径根目录。
  • 你在使用 Maven 吗?
  • @rustyx : 是的,我们正在使用 Maven

标签: java jboss-eap-6


【解决方案1】:

由于您使用的是 Maven,来自src/main/resources 的文件将自动在类路径中结束。

要从类路径加载资源,请使用以下内容:

InputStream in = getClass().getResourceAsStream("/image.jpg");

获取资源的路径或将其作为File 打开可能并不总是有效,因为文件可能仍存储在.war 文件中。因此,class.getResource() 将返回一个 URL,它只能被应用服务器的类加载器识别。

【讨论】:

  • 我需要获取资源路径而不是如上所示的输入流。当我在 JBoss 上的本地部署应用程序时,我得到的路径为 /D:/Servers/RedHat-JBoss/jboss-eap-6.4.0/jboss-eap-6.4/bin/content/appName-1.0.war/WEB-INF/classes/image.jpg。当我尝试读取文件时它失败了,说 FileNotfoundException。请提出建议。
  • 你不能。这条路实际上并不存在。只有D:/Servers/RedHat-JBoss/jboss-eap-6.4.0/jboss-eap-6.4/bin/content/appName-1.0.war,其余的/WEB-INF/classes/image.jpg在.war里面。
  • 你的意思是说如果 src/main/resources 文件夹中有一个图像文件并且应用程序构建/部署到 jboss 服务器,则无法获取该图像文件的路径.
  • Maven 构建过程将所有源文件编译并打包到appName-1.0.war,就像一个ZIP。该单个文件被部署到 jboss。
  • 但是在同一个战争中的所有属性和xml文件,它们工作正常并且加载完美。如果我无法按照您的建议获得文件的路径,那么该应用程序如何与属性和其他文件一起正常工作。任何建议。
【解决方案2】:

这是我在 Maven 项目中的文件结构:

src/main/resources/
src/main/resources/META-INF
src/main/resources/adir
src/main/resources/adir/afile.json

最后,这对我有用:

String resourceName = "adir/afile.json";
ClassLoader classLoader = Thread.currentThread().getContextClassLoader();
URL resource = classLoader.getResource(resourceName);
InputStream iStream = resource.openStream();
byte[] contents = iStream.readAllBytes();
System.out.println(new String(contents));

HTH, 托马斯

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2017-10-03
    • 1970-01-01
    • 2015-09-16
    • 1970-01-01
    • 2015-03-22
    • 1970-01-01
    • 1970-01-01
    • 2016-02-08
    相关资源
    最近更新 更多