打包Java項目(線程管理)生成可安裝的exe運行文件()

一. java 代碼:

package sessionMrg;

import java.io.BufferedReader;
import java.io.File;
import java.io.FileInputStream;
import java.io.IOException;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.ResultSet;
import org.apache.commons.logging.*;
import java.sql.SQLException;
import java.util.Properties;
import com.mysql.jdbc.PreparedStatement;
import com.mysql.jdbc.Statement;


public class SessionMrg {
	// JDBC 驅動名及數據庫URL
	private static  String driver ;
	private static  String url ;

	// 數據庫的用戶名和密碼
	private static  String username  ;
	private static   String password  ;
	// 定義數據庫連接
	private static Connection conn = null;
	// 定義sql語句執行對象
	private PreparedStatement pstmt;
	// 定義查詢返回的結果集合
	private ResultSet rs;
	//定義路徑
	private static String filepath="D:/MySQL/a.sql";
	//定義睡眠時間
	private static int sleepTime = 600000;
	private static Log log = LogFactory.getLog(SessionMrg.class) ;

	/**
	 * 經過靜態代碼塊加載DBHelper.properties
	 */
	static{
		loadConfig();
	}
	/**
	 * 加載數據庫配置信息DBHepler.properties,並給相關的屬性複製
	 */
	public static void loadConfig(){
		try {
			InputStream inStream =SessionMrg.class.getResourceAsStream("/config/DBHelper.properties");
			Properties prop=new Properties();
			prop.load(inStream);
			username=prop.getProperty("DBHelper.username");
			password=prop.getProperty("DBHelper.password");
			driver=prop.getProperty("DBHelper.driver");
			url=prop.getProperty("DBHelper.url");
			System.out.println(url);
			System.out.println(password);
		} catch (Exception e) {
			log.info(e.getMessage());
			//建議將異常信息經過throw的拋給調用者處理
			throw new RuntimeException("讀取數據庫配置文件異常!",e);
		}
	}

	/**
	 * 獲取數據庫連接
	 * 
	 * @return 數據庫連接
	 */
	public Connection getConnection() {
		try {
			Class.forName(driver);
			conn = DriverManager.getConnection(url, username, password);
		} catch (Exception e) {
			log.info(e.getMessage());
		}
		return conn;
	}



	/**
	 * 釋放資源
	 * @param args
	 */
	public void releaseConn(){
		if(rs !=null){
			try {
				rs.close();
			} catch (SQLException e) {
				// TODO Auto-generated catch block
				log.info(e.getMessage());
			}
		}
		if(pstmt !=null){
			try {
				pstmt.close();
			} catch (SQLException e) {
				// TODO Auto-generated catch block
				log.info(e.getMessage());
			}
		}
		if(conn !=null){
			try {
				conn.close();
			} catch (SQLException e) {
				// TODO Auto-generated catch block
				log.info(e.getMessage());
			}
		}
	}
	/**
	 * 刪除文件
	 * @param args
	 */
	public static void deleteFile(String sPath) {    
	    File file = new File(sPath);  
	    // 路徑爲文件且不爲空則進行刪除  
	    if (file.isFile() && file.exists()) {  
	        if(file.delete()){  
	        log.info("文件被刪除,能夠繼續執行");
	        System.out.println("文件被刪除,能夠繼續執行");
	        }
	        else{
	        	System.out.println("文件刪除失敗,程序必定報錯");
	        	log.info("文件刪除失敗,程序必定報錯");
	        }
	    }
	    else{
	    	System.out.println("文件不存在,繼續執行");
	    	log.info("文件不存在,繼續執行");
	    }
	    
	}  
	/**
	 * kill sessions
	 * @param args
	 */
	public static void KillSession(){
		try {
			Connection conn = new SessionMrg().getConnection();
			if (conn != null) {
				System.out.println("數據庫連接正常!");
				log.info("數據庫連接正常!");
			} else {
				System.out.println("數據庫連接異常!");
				log.info("數據庫連接異常!");
			}
			deleteFile(filepath);
			
			//打開鏈接
			Statement stmt =null;
			stmt =(Statement) conn.createStatement();
			String sql;
			sql = "select concat('KILL ',id,';') from information_schema.processlist where  command ='Sleep' and TIME > 1000 into outfile '"+filepath+"';";
			ResultSet rs = stmt.executeQuery(sql);
			System.out.println("生成a.sql");
			log.info("生成a.sql");
			rs.close();
			

			//按行讀取文件
			//BufferedReader是能夠按行讀取文件  
	        FileInputStream inputStream = new FileInputStream(filepath);  
	        BufferedReader bufferedReader = new BufferedReader(new InputStreamReader(inputStream));
	        String sql2 = null;
	        ResultSet rs2 = null ;
	        while((sql2 = bufferedReader.readLine()) != null)  
	        {  
	        	rs2 = null;
	        	rs2 = stmt.executeQuery(sql2);
	        	System.out.println(sql2);
	        	log.info(sql2);
	        } 
	        if (rs2!=null){
	        	rs2.close();
	        }else{
	        	System.out.println("沒有線程須要刪除");
	        	log.info("沒有線程須要刪除");
	        }
	        bufferedReader.close();
            stmt.close();
            conn.close();
		} catch (Exception ex) {
			// TODO Auto-generated catch block
			log.info(ex.getMessage());
		}
	}
	/**
	 * 每10分鐘kill 一次線程
	 * @param args
	 */
	public static void killSessionByTime(){
		while(true){
			try {
				KillSession();
				Thread.sleep(sleepTime);
				} 
			catch (InterruptedException e) {
				log.info(e.getMessage());
				}
		}
	}

	

	public static void main(String[] args) {
		killSessionByTime();

	}
}

(ps :還有很大的優化空間,html

1. 把全部的設置改爲讀取相對路徑下的config 文件,那全部的設置能夠經過更改config 文件更改;java

2. kill session 的語句,不須要導出到文件,直接經過jdbc循環執行便可)mysql

 

這個config 文件只能放在src的目錄下sql

二. 整個java項目導出成jar

1. 選擇導出runable jar ,直接導出jar file 可能不包括jar import 的jar 包

2.導出選項

3.用cmd 嘗試運行jar 包

cmd 到jar 包目錄,而後 java -jar killsession.jar數據庫

三. 生成可執行exe 文件

(注:只是exe ,要在java 對應版本的jdk環境下才能夠執行)

1. 下載安裝最新版本的exe4j 

目前java的環境是 jdk 1.8 因此下載的exe4j 也要是能夠在這個版本運行的才能夠用apache

2. 選擇"JAR in EXE "mode

3. 設置輸出路徑和應用簡稱

4.設置應用基本屬性

(注:ico 文件必定要原生態ico 文件,不能夠由其餘文件更改後綴改變的,能夠經過ps 作一個出來)session

64位的執行環境;jvm

5. 設置編碼方式,執行路徑,執行main 方法的class

設置編碼格式爲UTF-8, 輸入內容是:-Dfile.encoding=utf-8優化

6.設置程序運行時須要的jre 版本範圍,設置jre 相對路徑

因爲建立的exe 須要在jvm 上運行, 用戶只能安裝jdk很是麻煩. 能夠打包jre 文件成爲可安裝的exe 就比較方便網站

 

7.選擇程序執行時,會顯示在桌面的圖標

8. 後面所有點next 便可

四. 生成可安裝的exe,方便部署在沒有安裝jdk 的電腦

1.安裝Inno setup 軟件

2. 準備一下項目在一個文件夾裏面

如這裏的 SessionMrg, 等下要添加整個文件夾

3. 運行Inno setup 建立一個項目

4. 錄入安裝後自動建立的文件名, 版本 , 公司信息

5. 添加須要運行的exe ,以及jre 

6.安裝時,會建立開始菜單和桌面的快捷方式

7.錄入三個空的txt

(ps: 理論上會有用途)

8. 設置語言

9. 可安裝exe 一些設置

10. 點yes

11. 點是

12. 點否

開始

 

參考網站:  https://www.cnblogs.com/lsy-blogs/p/7668425.html

相關文章
相關標籤/搜索