Java Web Start為什麼能載入pack.gz
我們每次給國外更新的時候,都只是更新了 .jar.pack.gz, 不用更新jar。只知道這樣可以,不知道為什麼可以,每次出問題我們也會考慮,會不會載入成老的jar包了。
今天到官網上找了找,發現了原因:
以JBOSS為例,在webstart.war\WEB-INF\lib下面有jnlp-servlet.jar,我們點選介面上jnlp的連結後,會與jnlp-servlet.jar中的JnlpDownloadServlet互動,在根據jnlp上的resource查詢jar時,也會找以 .pack.gz或 .gz 結尾的同名檔案,見程式碼:
// pack200 compression
if (encoding != null && _mimeType != null &&
(_mimeType.compareTo(JAR_MIME_TYPE) == 0 || _mimeType.compareTo(JAR_MIME_TYPE_NEW) == 0) &&
encoding.toLowerCase().indexOf(DownloadResponse.PACK200_GZIP_ENCODING) > -1){
search_path = orig_path + pack.gz";
_resource = context.getResource(search_path);
// gzip compression
if (found == false && encoding != null &&
encoding.toLowerCase().indexOf(DownloadResponse.GZIP_ENCODING) > -1){
search_path = orig_path +".gz";
_resource = context.getResource(search_path);
因為它還會判斷.jar是否存在,所以不能說只有 .pack.gz沒有 .jar也行
orig_path就是以.jar結尾的檔案路徑。
而且jws是通過.jar的name來找 .pack.gz或 .gz的
最後說說為什麼會用.pack.gz?
其實原因很簡單,就是包會越來越大,不壓縮的話,下載的速度會很慢,對使用者和網費都是很大的考驗。所以在java5.0後提供了pack 200, 能將包壓縮到之前的10~15%。這樣下載就會相對好多了
jnlp-servlet.jar的原始碼在JDK的。。。/sample/jnlp/servlet目錄下面
今天到官網上找了找,發現了原因:
以JBOSS為例,在webstart.war\WEB-INF\lib下面有jnlp-servlet.jar,我們點選介面上jnlp的連結後,會與jnlp-servlet.jar中的JnlpDownloadServlet互動,在根據jnlp上的resource查詢jar時,也會找以 .pack.gz或 .gz 結尾的同名檔案,見程式碼:
// pack200 compression
if (encoding != null && _mimeType != null &&
(_mimeType.compareTo(JAR_MIME_TYPE) == 0 || _mimeType.compareTo(JAR_MIME_TYPE_NEW) == 0) &&
encoding.toLowerCase().indexOf(DownloadResponse.PACK200_GZIP_ENCODING) > -1){
search_path = orig_path + pack.gz";
_resource = context.getResource(search_path);
// gzip compression
if (found == false && encoding != null &&
encoding.toLowerCase().indexOf(DownloadResponse.GZIP_ENCODING) > -1){
search_path = orig_path +".gz";
_resource = context.getResource(search_path);
程式碼:
public JnlpResource(ServletContext context,
String name,
String versionId,
String[] osList,
String[] archList,
String[] localeList,
String path,
String returnVersionId,
String encoding) {
// Matching arguments
_encoding = encoding;
_name = name;
_versionId = versionId;
_osList = osList;
_archList = archList;
_localeList = localeList;
_returnVersionId = returnVersionId;
/* Check for existance and get last modified timestamp */
try {
String orig_path = path.trim();
String search_path = orig_path;
_resource = context.getResource(orig_path);
_mimeType = getMimeType(context, orig_path);
if (_resource != null) {
boolean found = false;
// pack200 compression
if (encoding != null && _mimeType != null &&
(_mimeType.compareTo(JAR_MIME_TYPE) == 0 || _mimeType.compareTo(JAR_MIME_TYPE_NEW) == 0) &&
encoding.toLowerCase().indexOf(DownloadResponse.PACK200_GZIP_ENCODING) > -1){
search_path = orig_path + pack.gz";
_resource = context.getResource(search_path);
// Get last modified time
if (_resource != null) {
_lastModified = getLastModified(context, _resource, search_path);
if (_lastModified != 0) {
_path = search_path;
found = true;
} else {
_resource = null;
}
}
}
// gzip compression
if (found == false && encoding != null &&
encoding.toLowerCase().indexOf(DownloadResponse.GZIP_ENCODING) > -1){
search_path = orig_path +".gz";
_resource = context.getResource(search_path);
// Get last modified time
if (_resource != null) {
_lastModified = getLastModified(context, _resource, search_path);
if (_lastModified != 0) {
_path = search_path;
found = true;
} else {
_resource = null;
}
}
}
if (found == false) {
// no compression
search_path = orig_path;
_resource = context.getResource(search_path);
// Get last modified time
if (_resource != null) {
_lastModified = getLastModified(context, _resource, search_path);
if (_lastModified != 0) {
_path = search_path;
found = true;
} else {
_resource = null;
}
}
}
}
} catch(IOException ioe) {
_resource = null;
}
}
String name,
String versionId,
String[] osList,
String[] archList,
String[] localeList,
String path,
String returnVersionId,
String encoding) {
// Matching arguments
_encoding = encoding;
_name = name;
_versionId = versionId;
_osList = osList;
_archList = archList;
_localeList = localeList;
_returnVersionId = returnVersionId;
/* Check for existance and get last modified timestamp */
try {
String orig_path = path.trim();
String search_path = orig_path;
_resource = context.getResource(orig_path);
_mimeType = getMimeType(context, orig_path);
if (_resource != null) {
boolean found = false;
// pack200 compression
if (encoding != null && _mimeType != null &&
(_mimeType.compareTo(JAR_MIME_TYPE) == 0 || _mimeType.compareTo(JAR_MIME_TYPE_NEW) == 0) &&
encoding.toLowerCase().indexOf(DownloadResponse.PACK200_GZIP_ENCODING) > -1){
search_path = orig_path + pack.gz";
_resource = context.getResource(search_path);
// Get last modified time
if (_resource != null) {
_lastModified = getLastModified(context, _resource, search_path);
if (_lastModified != 0) {
_path = search_path;
found = true;
} else {
_resource = null;
}
}
}
// gzip compression
if (found == false && encoding != null &&
encoding.toLowerCase().indexOf(DownloadResponse.GZIP_ENCODING) > -1){
search_path = orig_path +".gz";
_resource = context.getResource(search_path);
// Get last modified time
if (_resource != null) {
_lastModified = getLastModified(context, _resource, search_path);
if (_lastModified != 0) {
_path = search_path;
found = true;
} else {
_resource = null;
}
}
}
if (found == false) {
// no compression
search_path = orig_path;
_resource = context.getResource(search_path);
// Get last modified time
if (_resource != null) {
_lastModified = getLastModified(context, _resource, search_path);
if (_lastModified != 0) {
_path = search_path;
found = true;
} else {
_resource = null;
}
}
}
}
} catch(IOException ioe) {
_resource = null;
}
}
因為它還會判斷.jar是否存在,所以不能說只有 .pack.gz沒有 .jar也行
程式碼:
JnlpResource jnlpres = new JnlpResource(getServletContext(), dreq.getPath());
if (!jnlpres.exists()) {
throw new ErrorResponseException(DownloadResponse.getNoContentResponse());
}
if (!jnlpres.exists()) {
throw new ErrorResponseException(DownloadResponse.getNoContentResponse());
}
程式碼:
public boolean exists() { return _resource != null; }
程式碼:
_resource = context.getResource(orig_path);
orig_path就是以.jar結尾的檔案路徑。
而且jws是通過.jar的name來找 .pack.gz或 .gz的
最後說說為什麼會用.pack.gz?
其實原因很簡單,就是包會越來越大,不壓縮的話,下載的速度會很慢,對使用者和網費都是很大的考驗。所以在java5.0後提供了pack 200, 能將包壓縮到之前的10~15%。這樣下載就會相對好多了
jnlp-servlet.jar的原始碼在JDK的。。。/sample/jnlp/servlet目錄下面
相關文章
- 什麼是hibernate懶載入?什麼時候用懶載入?為什麼要用懶載入?(轉)
- web assembly是什麼,能幹什麼Web
- JAVA語言為什麼能跨平臺?Java
- 我為什麼看好騰訊START雲遊戲遊戲
- 為什麼Java中有三種基礎的類載入器?Java
- Java能幹什麼?Java
- Java新特性--Java Web Start (轉)JavaWeb
- 為什麼Web端登入需要驗證碼?Web
- 有用過java web start的嗎?JavaWeb
- Twitter能為你做什麼?
- Python能幹什麼?為什麼會火?Python
- Python能幹什麼?為什麼會這麼火?Python
- Java Web Start 實現關鍵 (轉)JavaWeb
- 為什麼大語言模型能將我們帶入AGI?模型
- JavaScript 為什麼能活到現在?JavaScript
- 為什麼Docker能迅速躥紅Docker
- 我能為開源做些什麼?
- 為什麼需要Web Service (轉)Web
- 為什麼要有 Servlet ,什麼是 Servlet 容器,什麼是 Web 容器?ServletWeb
- 什麼是Web workers?為什麼我們需要他Web
- 什麼是Web快取,為什麼要使用它Web快取
- 有用java web start做架構的嗎?JavaWeb架構
- 機器為什麼能夠學習?
- 虛擬偶像能為遊戲做什麼?遊戲
- Python為什麼能擴充套件Python套件
- 索引為什麼能提供查詢效能...索引
- 為什麼Web 設計會“死”?Web
- 為什麼Web3如此重要?Web
- 我為什麼把think in java 讀了10遍(轉載)Java
- Web3.0是什麼,為什麼MetaVerse這麼火?WebMetaverse
- 我為什麼使用 JavaJava
- Java中多執行緒啟動,為什麼呼叫的是start方法,而不是run方法?Java執行緒
- 為什麼騰訊雲能夠入選Forrester DDoS Mitigation Services報告?RESTMIT
- 程式語言十萬個為什麼之java web的基礎概念JavaWeb
- Java程式設計師工資為什麼這麼高?想要入門Java怎麼辦?Java程式設計師
- 各位談談對java web start的看法吧JavaWeb
- 學用Java Web Start 部署應用程式 (轉)JavaWeb
- 什麼是java?為什麼大家都學習java技術?Java