将java或javaweb项目打包为jar包或war包

article/2025/8/14 5:02:22

一、为什么打包

        关于此问题,网上众说纷纭。结合个人理解以及网上说法,打成jar包是为了方便别人使用。 如果是运行java程序,就不需要在寻找包含main方法的类去执行;如果是使用第三方jar包,直接在自己项目中导入jar包,而不是复制一堆类文件。打成war包是真实生产环境选择的web应用部署方式,网上说这样不会像直接复制文件夹那样可能造成文件丢失,而且服务器会对应用做优化,如删除空文件夹等。以上仅供了解。

二、如何打包

本机环境windows 10, jdk 1.8

打成jar或war包使用的是相同的工具 jdk/bin/jar.exe

1、打成jar包

|-----------------可以略过,仅为了方便理解打包需要注意的事项------------------|

项目简介

数据库表结构及其建表语句
在这里插入图片描述

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);

项目结构
在这里插入图片描述
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("请输入要查询用户的条数?(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找到项目编译输出的路径
在这里插入图片描述

在这里插入图片描述
(2) 在该目录下运行命令 jar -cvf helloworld.jar .

-c (create,创建)表时要创建文件
-v (verbose,冗长的,详细的) 在控制台打印压缩详情
-f (filename)指定压缩文件名
helloworld.jar 文件名可以自定义
. 表示helloworld目录下的所有文件,这里一定要写“.”,其他可能出错。(补充,*星号也可以)
在这里插入图片描述
至此打包成功,但不能运行。想要可以运行还要修改helloword.jar中的MANIFEST.MF文件。

(3)使用解压缩工具打开helloword.jar并编辑META-INF/MANIFEST.MF添加属性

MANIFEST.MF初始状态

Manifest-Version: 1.0
Created-By: 1.8.0_161 (Oracle Corporation)

添加属性:(注意,冒号为英文冒号且冒号后有空格

Main-Class: 包含main方法的类
Class-Path: 依赖的jar包的路径,如果依赖多个jar包,使用空格隔开
路径:相对路径,jar包相对于helloworld.jar文件的路径
           绝对路径,jar包在操作系统中的路径
常用相对路径,将依赖的jar包和自己的jar包放在同一级目录下,这样Class-Path直接写依赖jar包的名字即可。

添加属性后状态:

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)运行测试
将依赖复制到helloworld.jar 同级目录下,使用 java -jar helloworld.jar 运行程序。
在这里插入图片描述
在这里插入图片描述
如果jar包仅是为了供其他开发者使用,不需要运行,则进行到第(2)步即可。

1. 2、使用IDEA进行打包

在这里插入图片描述
在这里插入图片描述
Main Class: 包含main方法的类;
extract to the target JAR: 提取目标jar,此选项需要你为依赖的jar配置绝对路径。
copy to the output directory and link via manifest: 将依赖的jar复制到输出目录中,即和你项目打包的jar在同一级目录。这样IDEA就可以在MENIFEST.MF为Class-Path属性直接配置相对路径。
在这里插入图片描述
Output Directory: 打包后的输出路径。

运行测试:

首先进入jar包输入路径C:\Users\gzn\Desktop\helloworld\out\artifacts\HelloWorld_jar;
运行 java -jar helloworld.jar;
在这里插入图片描述

2、打成war包

comment是我的一个已将编译好的web项目,使用cmd进入comment目录下执行命令

jar -cvf comment.war .

在这里插入图片描述
注意在项目目录下执行命令, “.” 表示对项目目录下的所有文件进行打包,将打包好的项目复制到Tomcat/webapps目录下,启动Tomcat服务器,就可以进行测试了。


http://chatgpt.dhexx.cn/article/9AikRaCe.shtml

相关文章

java秒杀项目总结

java秒杀项目总结 本项目专攻秒杀模块,共分为七个章节 第一章 项目框架搭建 1.Spring Boot环境搭建 2.集成Thymeleaf , Result结果封装 前期前后端并未分离,使用Thymeleaf来获取后台传来的数据Result结果封装可以让代码更规范,成功的时候…

Java飞机大战项目

飞机大战游戏是一款十分有趣的射击类小游戏,流畅的画面,高难度的挑战。游戏中,玩家驾驶英雄机,在空中进行战斗。点击并移动自己的英雄机,发射炮弹,打掉敌飞机以及蜜蜂,来获得分数和奖励,打掉一架敌飞机赢得5分,打掉一只蜜蜂赢得1条命或是获得20次双倍火力,如果撞上敌…

Java游戏项目分享

很多小伙伴学习Java,在学习完基础之后都会去找一些项目练手,用来提升自己的技术,在这里,学姐找了一些Java初级练手项目,供小伙伴们用来练手。下面简单介绍一下本次学姐带来的六大Java游戏项目。 Java六大初级练手项目&…

Java项目文件目录结构介绍

Java中有三个比较容易弄混的“文件夹”。 folder 文件夹 ,普通的文件夹,IDE不会对他检查source folder 源文件夹 用于存放Java源代码的package java 中的包,必须存放在source folder 下。 src main javawebappresources 文件视图下的东西。…

如何将 Java 项目转换成 Maven 项目

亲测可用,若有疑问请私信 本文内容 Java 项目Maven 项目Java 项目转换成 Maven 项目 本文主要介绍如何将 Java 项目转换成 Maven 项目。首先要明确的是,用 Maven 管理 Java 项目的确方便。它带给你直观的方便是:你不用在网上找 Jar 包&…

Java项目获取路径方法

Java项目中根据相对路径和绝对路径获取文件的方法(重要) 首先,项目中文件分布情况如下,innerFile.txt位于test.test包下,innerInnerFile.txt位于test.test.inner包下,outterFile.txt位于包的根目录下&…

Java-银行项目

该项目用了三个类Customer,CustomerList,CustomerView。 Customer为实体对象,用来封装用户信息。相当于model。 CustomerList为Customer对象的管理模块,内部用数组管理Customer对象,并提供相应的添加,修改,删除和遍历…

MATLAB箱线图

MATLAB笔记之 作图 箱线图 1、峰值偏度检验 2、相关性作图 MATLAB分析数据相关性实例 3、箱线图看离散程度 如何使用matlab软件进行峰度-偏度检验https://jingyan.baidu.com/article/380abd0ab6f1c75d90192cee.html Matlab图解峰度kurtosis与偏度skewness 原1 Matlab图解峰度…

MATLAB运算符

1. MATLAB运算符 1.1 算术运算符 算术运算符运算法则算术运算符运算法则ABA与B相加(A、B为数值或矩阵)A-BA与B相减(A、B为数值或矩阵)A*BA与B相乘(A、B为数值或矩阵)A.*BA与B相应元素相乘(A、B为相同维度的矩阵)A/BA与B相除(A、B为数值或矩阵)A./BA与B相应元素相除(A、B为相同…

matlab subs函数

在matlab命令行查看subs函数的帮助 subs函数一共有三种使用方法: subs(s,old,new) subs(s,new) subs(s) 点击 subs 的参考页可以看到下面的详细说明: 第一种使用方法 说明:subs函数返回 函数s 的一个拷贝,s函数中的所有old变量都会替换为…

Matlab fprintf

fopen 文件访问类型 仅供学习记录 clc clear %% 01换行输出结果 fprintf([...\n...Matlab可以实现输出换行显示 \n...把你想要输出的内容换行写在[]中 \n...用换行符实现换行 \n...效果就是这样的 \n...]) %% …

数学建模与MATLAB计算之006.MATLAB中的条件语句

006.MATLAB中的条件语句 文章目录 006.MATLAB中的条件语句一、单分支if条件语句二、双分支if条件语句三、多分支if条件语句四、switch语句五、try语句 选择结构是根据给定的条件成立或不成立,分别执行不同的语句。 MATLAB 用于实现选择结构的语句有** if语句、swit…

matlab源码说明

目录 1.MATLAB概述 2.MATLAB程序使用几个常规注意实现 2.1.运行过程可能出现Out of Memory的问题解决办法 2.2.保存大于2G的数据 2.3.程序运行方法 1.MATLAB概述 Matlab经过不断的发展和完善,如今已成为覆盖多个学科,是具有超强数值计算能力和仿真分析能力的软件。…

Matlab逻辑运算符/与/或/非/异或/all/any

Logical()是非0则1,如果数字是非零,输出为1,数字为零,输出为0 与或非 与:&,有0则0,全1则1 或:|,有1则1,全0则0 非:~,0变1&#…

转行学计算机测试,转行软件测试后悔了

原标题:转行软件测试后悔了 很多时候,都在想当初做的转行软件测试行业的决定是对的吗?现在后悔还来得及吗? 其实我刚参加织雀教育的培训班一个月,各方面都学起来感觉有难度,毕竟是零基础转行的,…

【小结】南京大学软件工程专硕2021二战小结

今年的考研也告一段落了,从导师那里听到了一些风声,应该是可以上岸了,上班划水,没啥事,总结一下两年的混子生活吧。拟录取出来就公开。(三百多分也舔着个脸写经验贴) 逻辑很差、文笔稀碎、错别…

嵌入式软件工程师_程序人生一名嵌入式软件工程师的成长总结

哈喽,我是老吴。今天分享一篇18年毕业生的总结文。文章于首发于[嵌入式大杂烩] (2019-10-16)。文章里干货多多,各位慢慢品读吧。 一、我的工作经历 1.1 第一家公司 1.2 第二家公司 1.3 第三家公司二、小、中、大公司的特点 2.1 小公司 2.2 中等公司 2.3 大…

2023年双非二战跨考上岸南京大学软件工程842专硕考研初试403分经验贴

💡 考研过程的中心思想:脚踏实地、少走弯路、不要乱搞 目录 1.前期准备 2.个人情况 3.择校方面 4.备考里程表 5.数学 6.英语 7.政治 8.专业课 9.复试 10.后记 & 致谢 由于有不少朋友都私信我,想要做的笔记,所以我建…

气象学和计算机专业,没毕业就被签走的铁饭碗专业 气象学

有一个专业的就业率很好,到那时人们却不这样认为,是哪个专业呢? 气象学 每每一说到这个专业的就业好,都有很多人来反对。他怎么能好呢?我也没看见身边有人做气象这个行业的啊、 其实气象学的就业率是非常的高的&#x…

软件工程课程的第一次作业

软件工程课程第一次作业 1、建立一个public代码仓库1.1获取秘钥1.2 创建代码仓库1.2.1仓库地址 2、评估当前的自己2.1个人简介2.2当前值 3、展望未来3.1 回答关于构建之法的问题 4、学习路线 这个作业属于哪个课程广工软件工程课程学习社区作业要求作业链接作业目标创建博客、学…