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

时间:2021-09-08 00:00:30

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

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

Jboss上部署war

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

.
├── src
     └── main
        ├── java
        └── resources

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

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

加入后目录结构如下

├── src
│   ├── main
│   │   ├── java
│   │   │   └── com
│   │   ├── resources
│   │   │   ├── application.yml
│   │   │   └── META-INF
│   │   └── webapp
│   │       └── WEB-INF
│   │           ├── jboss-deployment-structure.xml
│   │           └── jboss-web.xml

jboss-deployment-structure.xml

<?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

<!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中放了一些文件,需要去获取文件内容

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

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

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

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

MAVEN中添加

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

具体使用:


 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

*:Not getting absolute file path from resources