如何將java或javaweb項(xiàng)目打包為jar包或war包
一、為什么打包
關(guān)于此問題,網(wǎng)上眾說紛紜。結(jié)合個(gè)人理解以及網(wǎng)上說法,打成jar包是為了方便別人使用。 如果是運(yùn)行java程序,就不需要在尋找包含main方法的類去執(zhí)行;如果是使用第三方j(luò)ar包,直接在自己項(xiàng)目中導(dǎo)入jar包,而不是復(fù)制一堆類文件。打成war包是真實(shí)生產(chǎn)環(huán)境選擇的web應(yīng)用部署方式,網(wǎng)上說這樣不會像直接復(fù)制文件夾那樣可能造成文件丟失,而且服務(wù)器會對應(yīng)用做優(yōu)化,如刪除空文件夾等。以上僅供了解。
二、如何打包
本機(jī)環(huán)境windows 10, jdk 1.8
打成jar或war包使用的是相同的工具 jdk/bin/jar.exe
1、打成jar包
|-----------------可以略過,僅為了方便理解打包需要注意的事項(xiàng)------------------|
項(xiàng)目簡介
數(shù)據(jù)庫表結(jié)構(gòu)及其建表語句

CREATE TABLE `customer` ( `cust_id` int(11) NOT NULL AUTO_INCREMENT, `cust_name` char(50) CHARACTER SET utf8 COLLATE utf8_general_ci NOT NULL, `cust_address` char(50) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL, `cust_city` char(50) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL, `cust_state` char(5) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL, `cust_zip` char(10) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL, `cust_country` char(50) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL, `cust_contact` char(50) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL, `cust_email` char(255) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL, PRIMARY KEY (`cust_id`) USING BTREE ) ENGINE = InnoDB AUTO_INCREMENT = 10006 CHARACTER SET = utf8 COLLATE = utf8_general_ci ROW_FORMAT = Compact; INSERT INTO `customer` VALUES (10001, 'Coyote Inc.', '200 Maple Lane', 'Detroit', 'MI', '44444', 'china', 'Y Lee', 'ylee@coyote.com'); INSERT INTO `customer` VALUES (10002, 'Mouse House', '333 Fromage Lane', 'Columbus', 'OH', '43333', '', 'Jerry Mouse', NULL); INSERT INTO `customer` VALUES (10003, 'Wascals', '1 Sunny Place', 'Muncie', 'IN', '42222', 'USA', 'Jim Jones', 'rabbit@wascally.com'); INSERT INTO `customer` VALUES (10004, 'Yosemite Place', '829 Riverside Drive', 'Phoenix', 'AZ', '88888', 'UK', 'Y Sam', 'sam@yosemite.com'); INSERT INTO `customer` VALUES (10005, 'gzn or 1=1', '4545 53rd Street', 'Chicago', 'IL', '54545', '', 'E Fudd', NULL);
項(xiàng)目結(jié)構(gòu)

app.java
package com.gzn.demo;
import java.sql.*;
import java.util.Scanner;
/**
* @author: gzn
* @date: 2019/4/13 10:53
*/
public class App {
public static void main(String[] args) {
int count = Integer.valueOf(args[0]);
System.out.println("請輸入要查詢用戶的條數(shù)?(0到5之間):");
Scanner sc = new Scanner(System.in);
int count = sc.nextInt();
String driver = "com.mysql.jdbc.Driver";
String url = "jdbc:mysql://localhost:3306/corejava";
String username = "root";
String password = "root";
String sql = "select cust_id, cust_name, cust_address, cust_city from customer limit 0, ? ";
try {
Class.forName(driver);
Connection conn = DriverManager.getConnection(url, username, password);
PreparedStatement pstat = conn.prepareStatement(sql);
pstat.setInt(1, count);
ResultSet rs = pstat.executeQuery();
while(rs.next()) {
System.out.println("cust_id:" + rs.getObject("cust_id").toString());
System.out.println("cust_name: " + rs.getObject("cust_name").toString());
System.out.println("cust_address: " + rs.getObject("cust_address").toString());
System.out.println("cust_city:" + rs.getObject("cust_city").toString());
System.out.println("----------------------" +"\n");
}
} catch (ClassNotFoundException e) {
e.printStackTrace();
} catch (SQLException e) {
e.printStackTrace();
}
}
}
|---------------------------------------------------------------------------|
1.1、使用jar手動打包
(1)使用cmd找到項(xiàng)目編譯輸出的路徑


(2) 在該目錄下運(yùn)行命令 jar -cvf helloworld.jar .
-c (create,創(chuàng)建)表時(shí)要?jiǎng)?chuàng)建文件
-v (verbose,冗長的,詳細(xì)的) 在控制臺打印壓縮詳情
-f (filename)指定壓縮文件名
helloworld.jar 文件名可以自定義
. 表示helloworld目錄下的所有文件,這里一定要寫“.”,其他可能出錯(cuò)。(補(bǔ)充,*星號也可以)

至此打包成功,但不能運(yùn)行。想要可以運(yùn)行還要修改helloword.jar中的MANIFEST.MF文件。
(3)使用解壓縮工具打開helloword.jar并編輯META-INF/MANIFEST.MF添加屬性
MANIFEST.MF初始狀態(tài)
Manifest-Version: 1.0 Created-By: 1.8.0_161 (Oracle Corporation)
添加屬性:(注意,冒號為英文冒號且冒號后有空格)
Main-Class: 包含main方法的類
Class-Path: 依賴的jar包的路徑,如果依賴多個(gè)jar包,使用空格隔開
路徑:相對路徑,jar包相對于helloworld.jar文件的路徑
絕對路徑,jar包在操作系統(tǒng)中的路徑
常用相對路徑,將依賴的jar包和自己的jar包放在同一級目錄下,這樣Class-Path直接寫依賴jar包的名字即可。
添加屬性后狀態(tài):
Manifest-Version: 1.0 Created-By: 1.8.0_161 (Oracle Corporation) Class-Path: mysql-connector-java-5.1.18.jar Main-Class: com.gzn.demo.App
(4)運(yùn)行測試
將依賴復(fù)制到helloworld.jar 同級目錄下,使用 java -jar helloworld.jar 運(yùn)行程序。


如果jar包僅是為了供其他開發(fā)者使用,不需要運(yùn)行,則進(jìn)行到第(2)步即可。
1. 2、使用IDEA進(jìn)行打包


Main Class: 包含main方法的類;
extract to the target JAR: 提取目標(biāo)jar,此選項(xiàng)需要你為依賴的jar配置絕對路徑。
copy to the output directory and link via manifest: 將依賴的jar復(fù)制到輸出目錄中,即和你項(xiàng)目打包的jar在同一級目錄。這樣IDEA就可以在MENIFEST.MF為Class-Path屬性直接配置相對路徑。

Output Directory: 打包后的輸出路徑。
運(yùn)行測試:
首先進(jìn)入jar包輸入路徑C:\Users\gzn\Desktop\helloworld\out\artifacts\HelloWorld_jar;
運(yùn)行 java -jar helloworld.jar;

2、打成war包
comment是我的一個(gè)已將編譯好的web項(xiàng)目,使用cmd進(jìn)入comment目錄下執(zhí)行命令
jar -cvf comment.war .

注意在項(xiàng)目目錄下執(zhí)行命令, “.” 表示對項(xiàng)目目錄下的所有文件進(jìn)行打包,將打包好的項(xiàng)目復(fù)制到Tomcat/webapps目錄下,啟動Tomcat服務(wù)器,就可以進(jìn)行測試了。
到此這篇關(guān)于如何將java或javaweb項(xiàng)目打包為jar包或war包的文章就介紹到這了,更多相關(guān)java打包為jar包或war包內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
springboot配置Jackson返回統(tǒng)一默認(rèn)值的實(shí)現(xiàn)示例
在項(xiàng)目開發(fā)中,我們返回的數(shù)據(jù)或者對象沒有的時(shí)候一般直接返回的null,那么如何返回統(tǒng)一默認(rèn)值,感興趣的可以了解一下2021-07-07
java開發(fā)分布式服務(wù)框架Dubbo調(diào)用過程
這篇文章主要為大家介紹了java開發(fā)分布式服務(wù)框架Dubbo調(diào)用過程,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步早日升職加薪2021-11-11
JpaRepository?實(shí)現(xiàn)簡單條件查詢
這篇文章主要介紹了JpaRepository?實(shí)現(xiàn)簡單條件查詢,具有很好的參考價(jià)值,希望對大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2021-11-11
IDEA POM文件配置profile實(shí)現(xiàn)不同環(huán)境切換的方法步驟
這篇文章主要介紹了IDEA POM文件配置profile實(shí)現(xiàn)不同環(huán)境切換的方法步驟2024-03-03
java解析JT808協(xié)議的實(shí)現(xiàn)代碼
這篇文章主要介紹了java解析JT808協(xié)議的實(shí)現(xiàn)代碼,需要的朋友可以參考下2020-03-03
SpringBoot集成antlr實(shí)現(xiàn)詞法和語法分析
Antlr4 是一款強(qiáng)大的語法生成器工具,可用于讀取、處理、執(zhí)行和翻譯結(jié)構(gòu)化的文本或二進(jìn)制文件,基本上是當(dāng)前 Java 語言中使用最為廣泛的語法生成器工具,本文給大家介紹了SpringBoot集成antlr實(shí)現(xiàn)詞法和語法分析,需要的朋友可以參考下2024-06-06
Java實(shí)現(xiàn)JDK動態(tài)代理的原理詳解
這篇文章主要介紹了Java實(shí)現(xiàn)JDK動態(tài)代理的原理詳解,Java常用的動態(tài)代理模式有JDK動態(tài)代理,也有cglib動態(tài)代理,本文重點(diǎn)講解JDK的動態(tài)代理,需要的小伙伴可以參考一下的相關(guān)資料2022-07-07

