有 Java 编程相关的问题?

你可以在下面搜索框中键入要查询的问题!

java如何从JAR访问资源?

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

jar放在Tomcat5.5的shared/lib中,以便共享给所有web应用程序

现在,在标准web应用程序中,如何访问css(例如)到JSP页面的样式表链接

多谢各位

注:有了Zk框架,我们可以通过一个简单的链接进行访问,即“~./web/css/header.css”,但它不适用于JSP:(


共 (2) 个答案

  1. # 1 楼答案

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

    xr.parse( new InputSource( filename ));
    

    click this link

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

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

    通常,您可以通过以下方式检索输入流:

    InputStream is = this.getClass().getClassLoader().getResourceAsStream("yourpackage/mypackage/myfile.xml");
    
  2. # 2 楼答案

    可以,但需要一些手动编码,因为默认servlet(container/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"/>
    

    我复制了文件布局。目录样式下的css在一个jar中,这是我的war的一部分。很简单,不是吗