JWorld@TW the best professional Java site in Taiwan
      註冊 | 登入 | 全文檢索 | 排行榜  

» JWorld@TW » Java SE 討論區  

按列印兼容模式列印這個話題 列印話題    把這個話題寄給朋友 寄給朋友   
reply to topicthreaded modego to previous topicgo to next topic
本主題所含的標籤
無標籤
作者 問一個關於Jar檔案的問題 [精華]
黑輪





發文: 42
積分: 0
於 2003-07-07 15:32 user profilesend a private message to userreply to postreply to postsearch all posts byselect and copy to clipboard. 
ie only, sorry for netscape users:-)add this post to my favorite list
目前我有一個Java Application

我現在將所有的資源包裝在一個Jar裡面, 並且可以正成執行.

但是, 現在為了可以方便升級, 以及更換一些圖檔之類的功能,

我希望把一些資源檔 另外放在一個Jar檔案中 以方便更換 (B.jar)

我目前可以做到的是 從A.jar以InputStream的方式讀入B.jar
並把我需要的檔案寫成實體的檔案
.
.
.
但是 好總是想要更好

我又看到了一個就做Jar protocol的東西
(
jar protocol 據說是JDK1.3以後所支援的, 格式類似如下
jar:file:/xxxx.jar!/com/name/type........
)
據說可以依據 URL 來取得該 檔案/物件

但是 經過我的測試沒出現Exception 但是 檔案又不進來
不知道錯在哪裡

希望有實做過的人 可以給點範例之類 或是說明

謝謝


reply to postreply to post
作者 Re:問一個關於Jar檔案的問題 [Re:黑輪]
JiaYun



版主

發文: 761
積分: 9
於 2003-07-07 16:19 user profilesend a private message to userreply to postreply to postsearch all posts byselect and copy to clipboard. 
ie only, sorry for netscape users:-)add this post to my favorite list
你的 URL 怎麼設的呢

reply to postreply to post
作者 Re:問一個關於Jar檔案的問題 [Re:黑輪]
黑輪





發文: 42
積分: 0
於 2003-07-07 17:06 user profilesend a private message to userreply to postreply to postsearch all posts byselect and copy to clipboard. 
ie only, sorry for netscape users:-)add this post to my favorite list
應該是說 我在A.jar的程式中

其中一個需要 呼叫到B.jar的地方
我是這樣做的

URL imgURL = ImageAnchorLoader.class.getResource( str.toString() );
ImageProducer imgProd = ( ImageProducer ) imgURL.getContent();
Image image = Toolkit.getDefaultToolkit().createImage( imgProd );

ImageAnchorLoader是屬於B.jar裡面的class

但是沒有錯誤訊息出現

還是除此之外
還有什麼可以從 A.jar 這個package中
讀取到B.jar裡面的圖檔嗎?

謝謝.

還有 前提就是 以後我只需要更新這個B.jar檔案
即可更新我的圖檔
不用再去動到A.jar這個package


reply to postreply to post
作者 Re:問一個關於Jar檔案的問題 [Re:黑輪]
Rosary





發文: 70
積分: 3
於 2003-07-07 17:24 user profilesend a private message to userreply to postreply to postsearch all posts byselect and copy to clipboard. 
ie only, sorry for netscape users:-)add this post to my favorite list
把B.jar放在遠端(http,ftp..)更新
你的ap的classloader用java.net.URLClassLoader就好啦..
試試看..


reply to postreply to post
作者 Re:問一個關於Jar檔案的問題 [Re:黑輪]
JiaYun



版主

發文: 761
積分: 9
於 2003-07-07 17:35 user profilesend a private message to userreply to postreply to postsearch all posts byselect and copy to clipboard. 
ie only, sorry for netscape users:-)add this post to my favorite list
我試了一下, 測試的兩個 jar 分別有 (路徑和 META-INF 省略)

button.jar:
demo/ButtonDemo.class

images.jar:
images/middle.gif

ButtonDemo 用到 images.jar 裡面的 middle.gif

相關程式片段: (例外處理省略)

Class cls = this.getClass();
ProtectionDomain pDomain = cls.getProtectionDomain();
CodeSource cSource = pDomain.getCodeSource();
URL loc = cSource.getLocation();
String url = loc.toString().substring(0, loc.toString().lastIndexOf("button.jar"));

URL url1 = new URL("jar:" + url + "images.jar!/images/middle.gif");
ImageIcon middleButtonIcon = new ImageIcon(url1);


這麼做是假設兩個 .jar 擺在一起, 又不要寫絕對路徑

讓兩個檔案不管拿到哪, 只要放在一起就可以用

可能又寫了白痴 code, 等大大來指導吧~


reply to postreply to post
作者 Re:問一個關於Jar檔案的問題 [Re:Rosary]
黑輪





發文: 42
積分: 0
於 2003-07-07 17:39 user profilesend a private message to userreply to postreply to postsearch all posts byselect and copy to clipboard. 
ie only, sorry for netscape users:-)add this post to my favorite list
目前我是把 A.jar 和 B.jar 放在同個目錄下

然後用 URLClassLoader的方式

URLClassLoader urlLoader = ( URLClassLoader ) imageLoader.getClass().
getClassLoader();
URL fileLocation = urlLoader.findResource( str.toString() );
Image img = getToolkit().createImage( fileLocation );

imageLoader 是屬於B.jar裡面的一個class
已經事先new起來了

現在出現了一個奇怪的錯誤
Uncaught error fetching image:
java.lang.NullPointerException
at sun.awt.image.URLImageSource.getConnection(Unknown Source)
at sun.awt.image.URLImageSource.getDecoder(Unknown Source)
at sun.awt.image.InputStreamImageSource.doFetch(Unknown Source)
at sun.awt.image.ImageFetcher.fetchloop(Unknown Source)
at sun.awt.image.ImageFetcher.run(Unknown Source)

這有解嗎??

我希望可以將兩個.jar都放在Locale端,
這樣使用者 使用這個程式的時候才不會等很久,
又或者有Internet的連線問題時, 仍可以使用


reply to postreply to post
作者 Re:問一個關於Jar檔案的問題 [Re:JiaYun]
黑輪





發文: 42
積分: 0
於 2003-07-07 17:57 user profilesend a private message to userreply to postreply to postsearch all posts byselect and copy to clipboard. 
ie only, sorry for netscape users:-)add this post to my favorite list
謝謝
我想找到問題了

原來 緊接在jar:後面的url需要使用絕對路徑

我一直以為不用.....真是$#&^%.....

謝啦 苦惱一個下午的東西解決了 ^^


reply to postreply to post
作者 Re:問一個關於Jar檔案的問題 [Re:黑輪]
JiaYun



版主

發文: 761
積分: 9
於 2003-07-07 17:58 user profilesend a private message to userreply to postreply to postsearch all posts byselect and copy to clipboard. 
ie only, sorry for netscape users:-)add this post to my favorite list
黑輪 wrote:
謝謝
我想找到問題了

原來 緊接在jar:後面的url需要使用絕對路徑

我一直以為不用.....真是$#&^%.....

謝啦 苦惱一個下午的東西解決了 ^^


所以我問你 URL 怎麼設....Black Eye

不過好像是我自己看不懂你的程式會跑出什麼 URL


JiaYun edited on 2003-07-07 18:00
reply to postreply to post
作者 Re:問一個關於Jar檔案的問題 [Re:JiaYun]
黑輪





發文: 42
積分: 0
於 2003-07-07 18:14 user profilesend a private message to userreply to postreply to postsearch all posts byselect and copy to clipboard. 
ie only, sorry for netscape users:-)add this post to my favorite list
我也不太曉得
只知道 可以這麼做
Class.getResource( string str); 會回傳一個URL
而developer.java.sun.com的討論區也是這麼說的

所以就變成這樣子啦


reply to postreply to post
作者 Re:問一個關於Jar檔案的問題 [Re:黑輪]
JiaYun



版主

發文: 761
積分: 9
於 2003-07-07 19:06 user profilesend a private message to userreply to postreply to postsearch all posts byselect and copy to clipboard. 
ie only, sorry for netscape users:-)add this post to my favorite list
黑輪 wrote:
我也不太曉得
只知道 可以這麼做
Class.getResource( string str); 會回傳一個URL
而developer.java.sun.com的討論區也是這麼說的

所以就變成這樣子啦


那你現在怎麼解決的呢?

對這不太熟, 想多看看可以怎麼寫 Tongue


reply to postreply to post
作者 Re:問一個關於Jar檔案的問題 [Re:黑輪]
黑輪





發文: 42
積分: 0
於 2003-07-08 14:45 user profilesend a private message to userreply to postreply to postsearch all posts byselect and copy to clipboard. 
ie only, sorry for netscape users:-)add this post to my favorite list
當初會想要做這些東西的原因來自於

我想要把資源檔(*.gif, *.jpg等等)以及定義檔(*.xml, *.properties)把他們和主程式分開來

所以就到了developer.java.sun.com看到了 他們說可以用:
1
2
URL url = MyClass.class.getResource("abc.gif"); 
Image img=Toolkit.getDefaultToolkit().getImage(url);

的方式來取得Image物件

原網址:http://developer.java.sun.com/developer/qow/archive/76/index.html

不過該篇討論的內容是只能用在同一個Jar檔案中

所以到了最後 還是JiaYun你的方法有用....


reply to postreply to post
作者 Re:問一個關於Jar檔案的問題 [Re:黑輪]
popcorny

Jakarta 2%

版主

發文: 752
積分: 20
於 2003-07-08 18:54 user profilesend a private message to userreply to postreply to postsearch all posts byselect and copy to clipboard. 
ie only, sorry for netscape users:-)add this post to my favorite list
其實很簡單
以下這樣就可以了...
URL url = getClass().getClassLoader().getResource("images/image.gif");
Image image = Toolkit.getDefaultToolkit().getImage(url);
我的class是在a.jar
images/image.gif是在b.jar
測試無誤
參考一下


reply to postreply to post
作者 Re:問一個關於Jar檔案的問題 [Re:popcorny]
JiaYun



版主

發文: 761
積分: 9
於 2003-07-08 19:13 user profilesend a private message to userreply to postreply to postsearch all posts byselect and copy to clipboard. 
ie only, sorry for netscape users:-)add this post to my favorite list
popcorny wrote:
其實很簡單
以下這樣就可以了...
URL url = getClass().getClassLoader().getResource("images/image.gif");
Image image = Toolkit.getDefaultToolkit().getImage(url);
我的class是在a.jar
images/image.gif是在b.jar
測試無誤
參考一下


可否放上兩個 jar 檔和 source code?


reply to postreply to post
作者 Re:問一個關於Jar檔案的問題 [Re:黑輪]
popcorny

Jakarta 2%

版主

發文: 752
積分: 20
於 2003-07-08 19:27 user profilesend a private message to userreply to postreply to postsearch all posts byselect and copy to clipboard. 
ie only, sorry for netscape users:-)add this post to my favorite list

Main.java
=============
import java.awt.image.*;
import java.awt.*;
import javax.swing.*;
import java.net.*;

public class Main{
public Main(){
URL url = getClass().getClassLoader().getResource("images/image.gif");
Image image = Toolkit.getDefaultToolkit().getImage(url);

JFrame f = new JFrame();
JLabel label = new JLabel(new ImageIcon(image));
f.setContentPane(label);
f.setSize(400,300);
f.show();
}
public static void main(String[] args){
new Main();
}
}
======================================

jar.zip (37.74k)


reply to postreply to post
作者 Re:問一個關於Jar檔案的問題 [Re:黑輪]
popcorny

Jakarta 2%

版主

發文: 752
積分: 20
於 2003-07-08 19:42 user profilesend a private message to userreply to postreply to postsearch all posts byselect and copy to clipboard. 
ie only, sorry for netscape users:-)add this post to my favorite list
也許有更簡單的方法
URL url = ClassLoader.getSystemResource("images\image.gif");
Image image = Toolkit.getDefaultToolkit().getImage(url);
應該是最好的方法了吧...Big SmileBig SmileBig SmileBig SmileBig SmileBig Smile


reply to postreply to post
作者 Re:問一個關於Jar檔案的問題 [Re:popcorny]
JiaYun



版主

發文: 761
積分: 9
於 2003-07-08 19:45 user profilesend a private message to userreply to postreply to postsearch all posts byselect and copy to clipboard. 
ie only, sorry for netscape users:-)add this post to my favorite list
原來要這樣執行:

java -cp a.jar;b.jar Main (windows)

java -cp a.jar:b.jar Main (linux)

難怪我之前試不出來 Tongue


reply to postreply to post
作者 Re:問一個關於Jar檔案的問題 [Re:黑輪]
黑輪





發文: 42
積分: 0
於 2003-07-09 09:41 user profilesend a private message to userreply to postreply to postsearch all posts byselect and copy to clipboard. 
ie only, sorry for netscape users:-)add this post to my favorite list
難怪我也試不出來

我之前是用

java -jar a.jar

然後在a.jar的Manifest.mf裡面放入了
Class-Path:b.jar

我還以為他會自己把b.jar放入到classpath中來


reply to postreply to post
作者 Re:問一個關於Jar檔案的問題 [Re:黑輪]
intomoon





發文: 2
積分: 0
於 2004-12-01 18:03 user profilesend a private message to userreply to postreply to postsearch all posts byselect and copy to clipboard. 
ie only, sorry for netscape users:-)add this post to my favorite list
TO楼上:王森大大的《JAVA深度历险》里面有说到,CLASSPATH在程序的执行过程中不能动态改变,只能通过-CP参数或者系统中环境变量设定

reply to postreply to post
作者 Re:問一個關於Jar檔案的問題 [Re:黑輪]
Kaworucloud





發文: 451
積分: 0
於 2008-07-23 16:51 user profilesend a private message to userreply to postreply to postsearch all posts byselect and copy to clipboard. 
ie only, sorry for netscape users:-)add this post to my favorite list
現在我有類似的問題,不過是要用在 Applet 上
照上面的方法去試
結果在 java.net.URL url = getClass().getClassLoader().getResource( "image" ); 拋出了 java.lang.ArrayStoreException: sun.awt.image.ToolkitImage
上面的方法不適用於 Applet 嗎……
classpath 已經有加入 resources.jar 了
----
url 印出來是 null 囧
----
照原本的方法就讀到了
table = ImageIO.read( getClass().getResource( "image" ) );


Kaworucloud edited on 2008-07-23 17:46
reply to postreply to post
巨乳は夢が詰まってるから大きい、貧乳はみんなに夢を与えているから小さいんだ!
» JWorld@TW »  Java SE 討論區

reply to topicthreaded modego to previous topicgo to next topic
  已讀文章
  新的文章
  被刪除的文章
Jump to the top of page

JWorld@TW 本站商標資訊

Powered by Powerful JuteForum® Version Jute 1.5.8