2

我想在我们现有的 JWS 应用程序中实现 Pack200。但最近在我当地的 POC 中,我无法使用 Pack200 文件模拟 Jardiff。

例如,我有 2 个版本的 jar 说

1.test__V1.jar 
2.test__V2.jar (additional one jar in lib folder)

我能够获取具有以下 URL 的两个 jar 之间的差异的 jar 文件(lib 文件夹中的另外一个 jar)

http://localhost/app/test.jar?version-id=2&current-version-id=1

使用 Pack200,我根据上述 jar 文件准备了 2 个 gz 文件,如下所示

1.test.jar.pack__V1.pack.gz
2.test.jar.pack__V2.pack.gz

我必须始终使用以下请求 URL 下载完整文件

http://localhost/app/test.jar.pack.gz?version-id=2&current-version-id=1

因此,我怀疑 Jardiff 是否能够支持 Pack200(.pack.gz) 版本的文件。希望大家可以在这里给我一些指导。谢谢 :)

4

1 回答 1

0

目前我正在查看这个,因为我想在我的 gradle plugin中实现 jardiff 支持。您很可能正在使用 Sun 的 JnlpDownloadServlet。我看了一下它的源代码。至少上述 url 的版本不支持 jardiff 文件的 pack200。

servlet 对 jar 文件的每个请求执行以下操作:

def (file, mime-type) = find requested file {
    if version-id and current-version-id given and jardiff is smaller than file__V${version-id}.jar.pack.gz
        -> (jardiff.jar, application/x-java-archive-diff)
    else if version-id given
        -> (file__V${version-id}.jar, application/java-archive)
    else 
        -> (file.jar, application/java-archive)
}
if file found {
    if ${file}.pack.gz exists
        return ${file}.pack.gz with $mime-type and content-encoding header pack200-gzip
    else if ${file}.gz exists
        return ${file}.gz with $mime-type content-encoding header gzip
    else 
        return ${file} without $mime-type content-encoding header
}

如果返回的文件是 jardiff 或者 jar 在 mime-type 标头中编码。

如果使用 pack200,则在 content-encoding 标头中进行编码。JNLP 规范确实解释了细节。

webstart 客户端确实为 jardiff 文件实现了 pack200,我使用 Java 8u31 和一些概念验证 servlet 对此进行了测试。

我将在 servlet 和 gradle 插件中实现该功能。请参阅我的插件的相应github issue以获取状态更新。

于 2015-03-14T21:35:20.763 回答