【Java】Jboss部署war以及获取Resource的真实路径

Jboss部署war以及获取Resource的真实路径

最近在将一个SpringBoot项目打成war包部署到Jboss中,中途遇到一些问题记录。

Jboss上部署war

普通的SpringBoot项目目录结构如下

1
2
3
4
5
.
├── src
   └── main
      ├── java
      └── resources

当我们打出war包后,想在Jboss中部署时需要添加jboss-deployment-structure.xml文件

关于此文件的配置可参考Jboss as 7 Developer Guide

加入后目录结构如下

1
2
3
4
5
6
7
8
9
10
11
12
├── src
│   ├── main
│   │   ├── java
│   │   │   └── com
│   │   ├── resources
│   │   │   ├── application.yml
│   │   │   └── META-INF
│   │   └── webapp
│   │   └── WEB-INF
│   │   ├── jboss-deployment-structure.xml
│   │   └── jboss-web.xml

jboss-deployment-structure.xml

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
<?xml version="1.0" encoding="UTF-8"?>
<jboss-deployment-structure>
<deployment>
<!-- 需要排除的 -->
<exclusions>
<module name="javax.validation.api" />
<module name="org.hibernate.validator" />
<!--Log4j exclude-->
<module name="org.slf4j" />
<module name="org.slf4j.impl" />
</exclusions>

<!-- 需要依赖的模块 -->
<dependencies>
<!-- This one always goes last. -->
<module name="javax.api" export="true"/>
</dependencies>
</deployment>
</jboss-deployment-structure>

jboss-web.xml

1
2
3
4
5
6
<!DOCTYPE jboss-web PUBLIC "-//JBoss//DTD Web Application 5.0//EN"  
"http://www.jboss.org/j2ee/dtd/jboss-web_5_0.dtd">
<jboss-web>
<context-root>app</context-root>
</jboss-web>

Jboss中获取Resource的真实路径

在使用过程中,因为在Resouce中放了一些文件,需要去获取文件内容

最开始使用如下方法去获取

1
2
// vfs:/content/app.war/WEB-INF/classes/data/data.yaml
new ClassPathResource("data/data.yaml")).getURI()

当我尝试创建一个File时报错找不到

因此借助JBoss VFS去获取当前资源的真实路径

MAVEN中添加

1
2
3
4
5
6
<!-- JBoss is using Virtual File System (VFS) -->
<dependency>
<groupId>org.jboss</groupId>
<artifactId>jboss-vfs</artifactId>
<version>3.2.14.Final</version>
</dependency>

具体使用:

1
2
3
4
5

VirtualFile content = (VirtualFile) this.getClass().getClassLoader().getResource("data/data.yaml").getContent();

// $JBOSS_HOME/tmp/vfs/temp/tempc755413fe36e407c/app.war-64dfd9c1b9e1463e/WEB-INF/classes/data/data.yaml
String realPath = content.getPhysicalFile().getPath()

参考

JBoss VFS

VFS3 User Guide

Jboss as 7 Developer Guide

StackOverflow:Not getting absolute file path from resources