【问题标题】:How to access to resources from a JAR?如何从 JAR 访问资源?
【发布时间】:2014-03-14 11:32:48
【问题描述】:

我有一个包含图像、css 等的 jar 库。 这个 jar 基于一个 Maven 项目。所有文件都放在 src/main/resources/web 目录下。

jar 放在 Tomcat 5.5 的 shared/lib 中,以便共享给所有 Web 应用程序。

现在,在一个标准的 Web 应用程序中,如何访问一个 CSS(例如)到一个 JSP 页面的样式表链接?

谢谢。

注意:使用 Zk 框架,我们可以使用简单的链接访问,即“~./web/css/header.css”,但它不适用于 JSP :(

【问题讨论】:

标签: java jsp servlets jar tomcat5.5


【解决方案1】:

您可以,但您需要一些手动编码,因为默认的 servlet(容器 /tomcat/ 的一部分,提供静态资源)对您的 jar 一无所知。你需要

  1. 实现您自己的可从类路径读取数据的 servlet
  2. 将其映射到某个 URL
  3. 在 JSP 中使用带有一些参数/路径来标识请求文件的 URL

我实现了简单的原型,它只处理 CSS 文件,并且不涵盖任何极端情况。但它有效,您可以根据需要对其进行扩展:

Servlet 很简单,它只是在其映射后面加入部分或 URL,并从类路径(例如 jar)加载资源:

package cz.literak.demo;

import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;
import java.io.InputStream;
import java.io.PrintWriter;

public class JarServlet extends HttpServlet {

    @Override
    protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        String path = request.getPathInfo();
        setContentType(path, response);

        InputStream streamIn = null;
        try {
            streamIn = getClass().getResourceAsStream(path);
            PrintWriter writer = response.getWriter();
            int c;
            while ((c = streamIn.read()) != -1) {
                writer.write(c);
            }
        } catch (IOException e) {
            streamIn.close();
        }
    }

    private void setContentType(String path, HttpServletResponse response) {
        if (path.toLowerCase().endsWith(".css")) {
            response.setContentType("text/css");
        }
        // TODO other mime types
    }
}

您需要注册 servlet 及其映射:

<servlet>
    <servlet-name>JarDefault</servlet-name>
    <servlet-class>cz.literak.demo.JarServlet</servlet-class>
</servlet>
<servlet-mapping>
    <servlet-name>JarDefault</servlet-name>
    <url-pattern>/jar/*</url-pattern>
</servlet-mapping>

你可以这样使用它:

<link rel="stylesheet" type="text/css" href="jar/styles/layout.css"/>

我在一个 jar 中的目录样式下复制了文件 layout.css,这是我的战争的一部分。很简单,不是吗?

【讨论】:

  • @MychaL 完成了
  • 如果您需要更多帮助,请随时询问
  • 效果很好!谢谢你。我验证了解决方案:)
【解决方案2】:

问题是我在调用 XMLReader 的 parse 方法时走得太远了。 parse 方法接受 InputSource,因此甚至没有理由使用 FileReader。将上面代码的最后一行更改为

xr.parse( new InputSource( filename ));

click this link

另一个示例代码:有时通过 Java Web Start 或任何其他方式在 jar 文件中分发应用程序很有用。因此,您可能必须从 jar 中读取一些资源(图像或属性文件)。你怎么能这样做 ?很简单,下面是一个获取图片的例子:

ImageIcon image = (new ImageIcon(getClass().getResource("yourpackage/mypackage/image.gif")));

一般情况下,您可以通过以下方式检索 InputStream:

InputStream is = this.getClass().getClassLoader().getResourceAsStream("yourpackage/mypackage/myfile.xml");

【讨论】:

    猜你喜欢
    • 2018-01-06
    • 2016-12-29
    • 2012-05-11
    • 2011-02-08
    • 2015-09-06
    • 1970-01-01
    • 2015-06-07
    • 2012-04-27
    相关资源
    最近更新 更多