我在Liberty 16.0.0.4中运行的(解压缩的)WAR中获取了JAR内部文件的URL。代码大致是:
URL url = servletContext.getResource(somePath);
URLConnection connection = url.openConnection();
long lastModified = connection.getLastModified();
网址格式为
"wsjar:file:/{path_to_WAR}/My.war/WEB-INF/lib/someLIB.jar!/META-INF/resources/foo/bar.txt"
我正在寻找文件的时间戳,因为它用于生成etags,缓存控制等。相反,我得到了someLIB.jar的时间戳。无论是在开发中的eclipse发布期间,还是在我们的自动构建过程中,jar的时间戳都毫无意义且不断变化。
这不是一个错误吗?有没有解决方法?
答案 0 :(得分:1)
wsjar
协议尝试与jar
协议具有相同的用户可见行为。唯一的预期差异是允许更好地控制缓存和Windows文件共享锁。 jar
协议返回JAR的时间戳,而不是条目,因此wsjar
协议执行相同的操作,因此这不是错误。理论上,你可以尝试提交一份RFE来为非标准行为添加一个选项,但是不清楚它是否真的会被实现。
作为一种解决方法,您可以调整构建以在JAR中存储包含所有其他文件的时间戳的其他文件,或者您可以将ETag更改为使用弱验证而不是强验证。 (其他人可能会建议解析wsjar
URL并自己打开JAR,但依赖其他JAR的语法则相当脆弱。)