读取WAR

时间:2017-07-10 12:23:43

标签: maven tomcat war

我正在使用Maven和Tomcat开发一个小型RESTFul项目。在我的实现中,我必须读取一个txt文件。 目前我正在测试Eclipse中的实现。使用绝对路径时,我可以毫无问题地执行我的代码。由于我必须生成一个war文件,我需要将txt文件封装在其中。使用Maven和

    <build>
    <sourceDirectory>src</sourceDirectory>
    <plugins>
        <plugin>
            <artifactId>maven-compiler-plugin</artifactId>
            <version>3.3</version>
            <configuration>
                <source>1.8</source>
                <target>1.8</target>
            </configuration>
        </plugin>
        <plugin>
            <artifactId>maven-war-plugin</artifactId>
            <version>2.6</version>
            <configuration>
                <warSourceDirectory>WebContent</warSourceDirectory>
                <failOnMissingWebXml>false</failOnMissingWebXml>
            </configuration>
        </plugin>
    </plugins>
</build>

我的war文件包含存储在最高级别的txt文件。你有什么建议从war文件中读取那个txt文件?我在这里找到了几个线程,但所有尝试都失败了。我需要一个规范,在Eclipse中进行测试时以及直接在Tomcat中执行时,我可以读取该文件。

在Eclipse中执行实现时,由于找不到文本文件,此代码不起作用。该文件位于WebContent文件夹中,在生成快照/战争后,您可以在war文件中找到该文件。

            InputStreamFactory isf = new InputStreamFactory() {
            public InputStream createInputStream() throws IOException {
                return new FileInputStream("/text_de.txt");
            }
        };

在没有访问权限的情况下在Eclipse中执行实现时我也尝试了以下操作(我知道,这会在执行war文件时导致错误):

return new FileInputStream("/WebContent/text_de.txt");

更新:

现在我可以成功地在Eclipse中执行实现。我首先尝试使用注释@Resource,但更改为@Context

    @Context
ServletContext servletContext;

然后,我添加了这一行:

String fileLocation = System.getProperty("com.example.resourceLocation",servletContext.getRealPath("/text_de.txt"));

由于

1 个答案:

答案 0 :(得分:2)

我不确定这对您的情况是否有帮助,但您可以使用doGet()(doPost()或其他人中的HttpServletRequest request来尝试:

return new FileInputStream(request.getServletContext().getRealPath("/text_de.txt"));

如果使用解压缩程序提取.war文件,则可以确定所需的路径,如果&#34; /text_de.txt"可能不正确,但很多时候/ WebContent /的内容最终都出现在.war文件的根目录中......

希望这会有所帮助,

注意:它本身的HttpServletRequest有一个名称相同的方法,但是这个方法已被弃用,所以你知道它是错误的。

在评论中讨论后:

在开发过程中需要一个不同的位置,

找到实际运行的tomcat实例的文件:tomcat / conf / catalina.properties。我不确定Eclipse是否正在运行它,或者您将Eclipse指向tomcat-home文件夹

添加com.example.resourceLocation=/full/path/to/eclipse/project/text_de.txt

之类的行

比使用类似的东西:

String fileLocation = System.getProperty(
    "com.example.resourceLocation",
    request.getServletContext().getRealPath("/text_de.txt")); 
    //this second parameter is a default value you can provide yourself
    //if the property does not exists it chooses the second as return value    

响应非servlet问题:

我正在使用Jersey link,我在这里使用类似的东西

@Context
private HttpServletRequest httpRequest;

@GET
@Path("file")
@Produces(MediaType.APPLICATION_JSON)
public Response getFile () {
    String fileLocation = System.getProperty(
        "com.example.resourceLocation",
        this.httpRequest.getServletContext().getRealPath("/text_de.txt")); 
        //this second parameter is a default value you can provide yourself
        //if the property does not exists it chooses the second as return value

    // do something with fileLocation
    FileInputStream fi = new FileInputStream(fileLocation);
    return Response.status(Response.Status.OK)
                .entity("body")
                .build();
}

在响应的@POST或@GET等函数所在的类中

几年前我在SOAP服务中使用了servlet过滤器并从doFilter()函数中检索了请求对象,

public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) throws IOException, ServletException {
        this.context = request.getServletContext( );

Eclipse可以使用项目的上下文菜单创建过滤器......

在这两种情况下你都有servletRequest对象或servletContext对象,所以你可以将它放到文件阅读器位置解决方案中

亲切的问候