Jardiff可以支持Pack200(.pack.gz)吗?

时间:2013-04-04 11:06:28

标签: java-web-start

我想将Pack200实现到现有的JWS应用程序中。但最近在我当地的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

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

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

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

1 个答案:

答案 0 :(得分:0)

目前我正在研究这个问题,因为我想在my gradle plugin中实施jardiff支持。很可能你正在使用Sun的JnlpDownloadServlet。我看了一下sourcecode。至少上面url的版本不支持pack200 for jardiff文件。

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,则在内容编码标头中进行编码。 JNLP Spec确实解释了详细信息。

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

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