2015年1月30日 星期五

2015年1月27日 星期二

教你打包Java程序,jar轉exe隨處可跑

http://fanli7.net/a/JAVAbiancheng/junit/2012/0617/172697.html

  本文出自One Coder博客,轉載請務必注明出處:http://www.coderli.com/archives/runnablejar-to-exe/
發現很多人問如何把Jar轉成exe程序。可能是想雙擊運行和隨處運行。其實這個並不難,我就簡單總結幾種方法,供大家参考,關鍵還是要知其所以然。
 
Java程序的運行不可能脫離JRE,不管你是Jar包還是exe程序。這點你必須了解。那麼在沒有JRE的機器上你的程序怎麼跑?很簡單,在你程序裏帶一份JRE就行了。
 
先介紹集中打包的方法:
 
Eclipse:

最簡單直接的方法,選擇你想打包的程序,右鍵export...

選擇Runnable Jar file。(即可執行的Jar包)

選擇你程序的主類,就是還有Main函數的類。點Finish即可。
 
在你的機器上,設置好Jar文件的打開方式(別默認用解壓縮的工具打開就行),雙擊即可運行。

這個跟在命令行執行:
 
java -jar forfun.jar的效果是一样的。
 
其實一個Jar能運行,關鍵還是配置Jar內部的MANIFEST.MF文件。該文件存在於Jar包根目錄的META-INF文件夾內。主要由於指定主類(Main)的位置:
 
Manifest-Version: 1.0
Main-Class: one.coder.jdk.JDKMain
 
版本可以自己指定,默認生成是1.0。主類位置需要指定。注意,Main-Class的冒號後,要跟一個空格。
如果你還有要依賴的Jar包,則可以配置Class-Path來指定。
 
Class-Path: ./ logback-core-0.9.29.jar junit-4.9.jar slf4j-api-1.
 6.1.jar logback-classic-0.9.29.jar hamcrest-core-1.1.jar
 
打開剛才生成的Jar文件,你可能發現多了一些Eclipse的東西,並且主類變成了
 
Main-Class: org.eclipse.jdt.internal.jarinjarloader.JarRsrcLoader
 
也就是通過Eclipse提供的這個主類來加載的你程序。如果你不喜歡這样,將其去掉。自己進行配置。筆者通過一個不依賴任何Jar包的小程序進行說明。
這是筆者打出Jar的內部截圖,去掉所有跟我的程序不相關的東西。MANIFEST.MF的配置也很簡單。
 
Manifest-Version: 1.0
Main-Class: one.coder.jdk.JDKMain
 
在有JRE的機器上,雙擊一样可以運行。
 
注:這裏需要提一下,盡量不用用解壓軟件自帶的編輯器進行編輯,如果你編輯後發現不能運行,提示打開jar錯誤等信息,很可能是由於你編輯的MANIFEST.MF文件的編碼錯誤。導致無法解析。默認是采用ANSI編碼格式的。不要改成UTF-8等。筆者被這個問題,困擾了近半個小時。
 
接下來說說在沒有JRE的機器上怎麼辦?
 
最簡單的手動的辦法就是寫一個bat腳本。並且帶一份jre在你的程序裏。
把圖中的三個文件,放入同一個文件夾中。
start.bat內容如下:
 
.\jre7\bin\java -jar .\run.jar
 
說白了就似乎調用jre中的java命令,執行指定的jar程序。 雙擊start.bat,執行成功。
 
如果你非要打成exe程序,筆者推薦一個工具JSmooth。簡單好用。同样這也肯定是需要JRE指定的。
關於JSmooth的教程,筆者找到了一個不錯的教學貼:http://yisufuyou.iteye.com/blog/403556
 
按照裏面的步驟,你一定可以成功。
說了這麼多,如果還有什麼不明白的,可以给我留言,一起討論研究。
 
PS1:默認的JRE體積實在太大,你可以考慮精簡JRE還節約空間,這部分內容,不在本文討論。另外,如果你想把你的軟件做成安裝包的形勢,可考慮InstallAnyWhere(http://www.flexerasoftware.com/products/installanywhere.htm)這個工具,會有
 
PS2:筆者研究的過程中,为了模擬沒有JRE的環境,真是百般折騰,因为筆者把所有環境變量都刪掉,還有可以運行。不知道是不是從JDK7開始,Java居然在我的System32路徑下,也放置Java.exe等程序,也就是說,不用配置Path了。jre路徑的指定,貌似也寫入了注冊表,不過這點,筆者沒有親自證實,只是在注冊表中簡單的搜索了一下,僅發現了JavaFX的配置和一些其他的Java配置,沒有深入研究,不好定論。有興趣可以研究下,也麻煩告訴我一聲。
 
本文出自One Coder博客,轉載請務必注明出處:http://www.coderli.com/archives/runnablejar-to-exe/

smack解析自定义的包结构

無法查看此摘要。請 按這裡查看文章。

2015年1月25日 星期日

Android 基於xmpp協議,smack包,openfire服務端的高仿QQ的即時通訊實現【5】消息發送...

http://www.apkbus.com/blog-125132-52804.html

这一节就是消息发送与接收的实现了
接收消息主要代码:
[html] view plaincopy
  1. //消息监听  
  2.         ChatManager cm = XmppConnection.getConnection().getChatManager();         
  3.         //发送消息给pc服务器的好友(获取自己的服务器,和好友)  
  4.         final Chat newchat = cm.createChat(pFRIENDID, null);  
  5.         cm.addChatListener(new ChatManagerListener() {  
  6.             @Override  
  7.             public void chatCreated(Chat chat, boolean able) {  
  8.                 chat.addMessageListener(new MessageListener() {  
  9.                     @Override  
  10.                     public void processMessage(Chat chat, Message message) {  
  11.                         //收到来自pc服务器的消息(获取自己好友发来的信息)  
  12.                         if(message.getFrom().contains(userChat))  
  13.                         {  
  14.                             //获取用户、消息、时间、IN  
  15.                             String[] args = new String[] {userChat, message.getBody(), TimeRender.getDate(), "IN" };  
  16.                             //在handler里取出来显示消息  
  17.                             android.os.Message msg = handler.obtainMessage();  
  18.                             msg.what = 1;  
  19.                             msg.obj = args;  
  20.                             msg.sendToTarget();  
  21.                         }  
  22.                     }  
  23.                 });  
  24.             }  
  25.         });  

发送消息注意代码:

[html] view plaincopy
  1. //发送消息  
  2.         Button btsend = (Button) findViewById(R.id.formclient_btsend);  
  3.         btsend.setOnClickListener(new OnClickListener() {  
  4.             @Override  
  5.             public void onClick(View v) {  
  6.                 //获取text文本  
  7.                 String msg = msgText.getText().toString();            
  8.                 if(msg.length() > 0){  
  9.                     //发送消息  
  10.                     listMsg.add(new Msg(pUSERID, msg, TimeRender.getDate(), "OUT"));  
  11.                     //刷新适配器  
  12.                     adapter.notifyDataSetChanged();               
  13.                     try {  
  14.                         //发送消息  
  15.                         newchat.sendMessage(msg);                     
  16.                     }catch (XMPPException e)  
  17.                     {  
  18.                         e.printStackTrace();  
  19.                     }  
  20.                 }  
  21.                 else  
  22.                 {  
  23.                     Toast.makeText(ChatActivity.this, "发送信息不能为空", Toast.LENGTH_SHORT).show();  
  24.                 }  
  25.                 //清空text  
  26.                 msgText.setText("");  
  27.             }  
  28.         });  

以下是修改心情的实现,你在自建客户端修改心情,Spark端会即时修改;


主要代码:
[html] view plaincopy
  1. myMood = ((EditText)myMoodView.findViewById(R.id.myMood)).getText().toString().trim();  
  2.                     System.out.println("我更改的心情是:"+myMood);  
  3.                     XmppService.changeStateMessage(connection, myMood);  
  4.                     myStatusText.setText(myMood);  

[html] view plaincopy
  1. /**   
  2.      * 修改心情   
  3.      * @param connection   
  4.      * @param status   
  5.      */    
  6.     public static void changeStateMessage(final XMPPConnection connection,final String status)    
  7.     {    
  8.         Presence presence = new Presence(Presence.Type.available);    
  9.         presence.setStatus(status);    
  10.         connection.sendPacket(presence);        
  11.     }