手工完成java项目(一)——J2SE项目

本文详细介绍了从创建文件夹、编写Java类、编译、生成第三方jar包到最终制作可执行jar包的全过程。通过实践操作,了解jar包的制作流程,包括使用命令行工具实现jar包的创建与引用,以及如何将多个jar包整合为一个可执行程序。同时,展示了如何利用bat文件实现双击运行,以及将jar包转换为exe文件的步骤。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

   工作一年多了,却从未手工打过jar包,从未手动写过一个java项目,当然用IDE工具这一切都是很简单的事,可是如果让你用记事本,用命令能完成这一过程么?当然用eclipse点点鼠标就OK了,何必那么麻烦呢。当然实际操作中肯定是用IDE工具来提高工作效率,但是对于其本质不了解,那只能是知其然而不知其所以然,也就只能知道了其本质,这样我们坐起事来才游刃有余。

   接下来将详细的介绍这一个过程,本文将分两篇,一篇讲J2SE项目,一篇讲J2EE项目。

   本篇将介绍如何完成第三方jar包和一个在window中的可执行程序:

做第三方jar包

1.首先将一个文件夹命名为mytest,在目录下建三个子文件夹分别为src(存放java源文件),bin(存放编译后的class文件)和lib(存放第三方jar包)。然后在src目录下建立cn/jun/info,和cn/jun/test包文件夹,其目录结构如下:
  ----mytest
             ----src
                   ----cn
                       ----jun
                           ----info
                           ----test
             ----bin
             ----lib
 
2.分别在info和test2下建立Info.java和Test.java文件,用记事本编辑内容分别如下
 
Test类
package cn.jun.test;

import cn.jun.info.Info;
public class Test{
	
  public String test(String a){
       System.out.println("执行依赖jar包的方法");
       return a+"****************"+Info.info1;
  }
}
  
Info类
package cn.jun.info;
public class Info
{
	public static String info1="测试信息1…………";
	public static String info2="测试信息2…………";
}
 

3.编译java文件 
 
在dos窗口下  执行命令切换到  mytest目录下输入命令     javac -d bin src/cn/jun/info/*.java src/cn/jun/info/test/*.java  (这句话的意思是将cn/jun/info和cn/jun/info/包下的所有.java文件编译到bin目录下)
编译成功后目录bin目录下会增加class文件,文件目录如下:
  ----mytest
             ----src
                   ----cn
                       ----jun
                           ----info
                              ----Info.java
                           ----test
                              ----Test.java
             ----bin
                   ----cn
                       ----jun
                           ----info
                              ----Info.class
                           ----test
                              ----Test.class
             ----lib

 
4.打成jar包,完成第三方jar包的制作
 
在dos窗口下  执行命令切换到mytest的  bin目录下然后执行命令  :     jar vcfM mytest.jar  cn   (见附件“jar命令详解.txt"的 或 http://bbs.chinaunix.net/viewthread.php?tid=137481)
bin目录下就生成了mytest.jar包
 
5.关于第三方jar包的引用
 
  按照如上步骤我们重新做一个mytest2的jar包,里面仅有Test2这个类,目录结构及内容如下: 
  注:编译时用 javac -d bin src/cn/jun/info/test2/*.java 命令时会报软件包不存在,因为你没有引入第三方包,正确命令是 :javac -d bin -classpath lib/mytest.jar src/cn/jun/info/test2/*.java
  ----mytest2
             ----src
                   ----cn
                       ----jun
                           ----test2
                               ----test2.java
             ----bin
                   ----cn
                       ----jun
                           ----test2
                               ----test2.class
             ----lib
                  ----mytest.jar 
Test2类
 
package cn.jun.test2;

import cn.jun.info.Info;
import cn.jun.test.Test;
public class Test2{
	
  public String testjar(String a){
      Test t=new Test();
      System.out.println(a);
      System.out.println("执行第三方jar包的方法!");
      return a+"****************"+t.test("调用依赖包……");
  }
}
然后同样在 bin目录下然后执行命令  :     jar vcfM mytest2.jar  cn  

做可执行jar包
 
1.依照前面的步骤完成如下目录结构
 
  ----mytestmain
             ----src
                   ----cn
                       ----jun
                           ----testmain
                               ----testmain.java
             ----bin
                   ----cn
                       ----jun
                           ----test2
                               ----test2.class
             ----lib
                  ----mytest.jar
                  ----mytest2.jar
             ----MANIFEST.MF
Testmain类
package cn.jun.testmain;


import cn.jun.test2.Test2;
public class Testmain{
  public static void main(String args[]){
          System.out.println("测试打jar包,形成可执行文件!");
	  Test2 mt=new Test2();
	  System.out.println(mt.testjar("调用第三方jar包……"));
	 try {
		Thread.sleep(5000);//当双击执行时,让其停留一会,这样可以看到打印结果,否则闪一下就过了
	} catch (InterruptedException e) {
		// TODO Auto-generated catch block
		e.printStackTrace();
	}
  }
}
 
2.编译并打包
 
同样用命令javac -d bin -classpath lib/mytest2.jar src/cn/jun/info/testmain/*.java 编译
打jar包的时候就有区别了,首先我们要写一个MANIFEST.MF,内容如下:
Manifest-Version: 1.0
Created-By: 1.6.0_22 (Sun Microsystems Inc.)
Main-Class: cn.jun.testmain.Testmain
Class-Path: lib/mytest.jar lib/mytest2.jar
 注:  Main-Class: cn.jun.testmain.Testmain   是说明程序的入口,cn.jun.testmain.Testmain是注程序的路径
       Class-Path: lib/mytest.jar lib/mytest2.jar 是说明了程序要引用的jar包,中间用空格隔开,这个路径是相对与jar包所在的目录下
 
在bin目录下用jar命令打包:jar vcfm mian.jar ../MANIFEST.MF  cn    (注:这里的MANIFEST.MF在mytestmian目录下,所以用../MANIFEST.MF ,只要路径对了就行 )
 
3.完成可执行程序
 
如果用命令  java -jar mian.jar的话一定会报错:找不到Test2这个类,因为它没有找到mytest.jar和mytest.jar俩个包
那怎么包了,既然他是一个程序了那我们新建一个文件夹main,将mian.jar放到该目录下,在main下新建一个目录lib并将mytest.jar和mytest.jar复制到下面(这里就表明了jar包的路径Class-Path: lib/mytest.jar lib/mytest2.jar )
再用命令执行java -jar mian.jar就可以正确执行了

 制作为bat文件,让其双击就可以执行
在main目录下建一个mytest.bat文件,用记事本编辑类容如下:
java -jar mytest.jar


完成了,这样双击就mytest.bat文件就可以之际执行程序了
 
这样一个可执行的程序就完成了,main文件夹复制到任何装有有java环境的机子上都可以执行了
 
当然你还可以将其制作成exe文件,并对图标进行一些美化请参加(见附件中的“制作exe文件.txt"的七八九步)

 






















 

 设有总行CCH,若干个支行如:支行CIBC、支行TD等(定是两个支行)。CIBC支行通过网络与CCH总行及其若干个CIBC ATM终端机相连。TD支行通过网络与CCH总行及其若干个TD ATM终端机相连。客户持支行的卡在ATM终端机上进行“存款”、“取款”、“查询余额”、“结束本次操作”四个操作。CIBC支行的客户可以在CIBC的ATM终端机上操作。也可在TD支行的ATM机上跨行操作。每个支行的客户在各自的支行上有账户。初始时各个支行设有100个账户。每个账户有现金100元。总行CCH只保存有各个支行CIBC与TD的所有账户的现金总额。每个支行的每个账户的现金若发生变化,都要向总行报告,以便总行进行支行现金的总额平衡。   每个账户有账号、密码、金额、用户的情况(姓名、性别等)。CIBC支行的客户可以在CIBC支行的ATM终端上进行交易操作, 也可以跨行在TD支行的ATM终端机上进行交易操作。此时跨行交易操作时,CIBC客户的身份验证,TD支行要通过网络委托他的原银行即CIBC支行代为查询验证。所有的交易操作TD支行都要委托他的原银行CIBC支行进行处理并将结果反馈给客户。   初始时总行CCH服务器先启动。然后各个支行的服务器再启动并向总行CCH服务器报到。然后各个支行的ATM终端启动并向自己所属的支行服务器报到。若支行的服务器没有启动,则该支行的客户不能进行交易。   进步扩展的功能有:行内转账、跨行转账。无论哪种转账,目标账户即使支行服务器还没有开启,也允许进行(此时只能存、不能取款、查询.这是因为无法身份验证)。该转账信息先暂存于总行CCH处。当支行服务器启动向总行CCH报到时,总行CCH服务器立即将转账信息传给该支行。假设CCH总行为每个支行最多保存30条转账记录。(扩展功能暂时还没实现)
计算器 、 背景描述 该计算器模仿Windows自带的计算器,只实现标准型计算器功能。 在完成Swing的学习后,练习使用Swing中JFrame、JButton、JLabel、JTextField、JMenu、JMenuItem等组件完成图形界面绘制。 二、 实现要求 前期能够独立思考并完成计算器的逻辑代码。 三、 实现技术 a) 熟练使用JButton、JTextField、JLabel等Swing中组件。 b) 熟练使用BorderLayout、FlowLayout、BoxLayout、GridLayout等布局。 c) 能够根据需要覆盖paint函数,定制自己需要的组件。 四、 类图 a) 类图 b) 类图说明 类名称 Calculator 类描述 计算器界面类。 描述 main 函数描述 Calculator() 计算器界面类缺省构造函数。 private void initMenu() 初始化菜单添加。 private void initButton() 初始化按钮。按钮的初始化、部署、事件添加等。 private void initAdd() 初始化各个容器的添加。 public void actionPerformed(ActionEvent e) 处理按钮事件。1.复制事件2.粘贴事件,此处应用正则表达式(详细请参考类 java.util.regex.Pattern)解析粘贴板中的内容,仅得到内容中最后的数字和小数点。3.关于事件 private boolean isContain(String str,String ch) 检测某字符串中是否含某个字符串。 private void showResult(String result) 设置计算的得到的结果。 private void clearAll(String result) 清空结果。 private void countResult(double value2) 计算结果并显示结果。 内部类 private class ButtonListener extends AbstractAction 按钮事件。括+、-、*、/、1/x、数字等按钮事件。 此类继承AbstractAction 类名称 CalculateButton 类描述 定制自己的按钮类。练习自己定制按钮。比如定制按钮的高度、宽度、文字等。 描述 main 函数描述 public CalculateButton(Action listener,String text,int key,boolean isctrl) 构造个具有缺省事件、指定文本、指定快捷键的JButton。 public CalculateButton(Action listener,String text,int key,boolean isctrl,Color color) 构造个具有缺省事件、指定文本、指定快捷键、指定文本颜色的JButton。 public CalculateButton(Action listener,String text,int key,boolean isctrl,Color color,int width,int height) 构造个具有缺省事件、指定文本、指定快捷键、指定文本颜色的JButton。 protected void paintBorder(Graphics g) 绘制边界。 c) 效果图 五、 技术技巧提问 a) 思考用户如果多次连续按如+、-、*、/等键时,应该怎么处理?请仔细考虑好该逻辑。 b) 练习使用剪贴板的功能,实现复制、粘贴功能。考虑当粘贴板中数据值带有多个小数点时如何处理然后显示到文字框上。
飞鸽传书 、 背景描述 学习完网络(UDP)后,可以练习部署该项目。 二、 实现要求 模仿飞鸽传书完成飞鸽传书的大部分功能(主要是发送组播信息,传送文件等功能)。 三、 实现技术 a) 使用DatagramSocket、DatagramPacket传递UDP数据。 b) 使用MulticastSocket发送、接受组播消息。 c) 使用ServerSocket、Socket发送接受文件。 d) 使用DefaultTableModel定制需要的JTable。 e) 使用SystemTray、TrayIcon制作托盘图标。 四、 类图 a) 类图 b) 类图说明 类名称 IPMsg 类描述 飞鸽传书主程序。 描述 main 函数描述 public static void main(String[] args) 类名称 FileData 类描述 此处加入类详细说明 描述 data 函数描述 public String getFileName() public void setFileName(String fileName) public String getFilePath() public void setFilePath(String filePath) public boolean isFile() public void setFile(boolean isFile) public static FileData stringToFileData(String str) 根据字符串将信息转换为FileData对象。<br> 类名称 FSMessage 类描述 传递消息类。 描述 data 函数描述 public FSMessage() public FSMessage(Integer type,Object object) public Object getObject() public void setObject(Object object) public Integer getType() public void setType(Integer type) 类名称 User 类描述 用户类。 描述 data 函数描述 public String getHostName() public void setHostName(String hostName) public String getIpAdress() public void setIpAdress(String ipAdress) public String getLoginName() public void setLoginName(String loginName) public String getPriority() public void setPriority(String priority) public String getUserName() public void setUserName(String userName) public static User getSelf() 获取本机的User对象。 public String toString() public boolean equals(Object obj) public static User strToUser(String userStr) 根据字符串转换成User对象。 类名称 DirectoryChoose 类描述 目录选择对话框。 描述 frm 函数描述 public DirectoryChoose(Component parent,String title,int mode) 打开文件选择对话框。 public DirectoryChoose(Component parent,String title) 保存文件对话框。 类名称 FileSendMonitor 类描述 文件传送监视器 描述 frm 函数描述 public FileSendMonitor() private void init() 初始化面板。 public void actionPerformed(ActionEvent e) private class MyDefaultTableModel extends DefaultTableModel table的Model。 类名称 FileSendOK 类描述 文件传送成功。 描述 frm 函数描述 public FileSendOK(Frame owner, boolean modal,String info) 文件传送成功构造函数。 private void init() 初始化面板。 public void actionPerformed(ActionEvent e) 按钮点击事件。 private void setInfo(String info) 设置当前传送成功的消息。 类名称 FillWidth 类描述 仅仅为了填充BorderLayout的宽度。 描述 frm 函数描述 public FillWidth(int width,int height) 按照指定宽度和高度构造个JPanel public FillWidth(int width,int height,Color color) 按照指定宽度和高度、颜色构造个JPanel 类名称 IPMsgMainFrm 类描述 飞鸽传书的主窗体类。 描述 frm 函数描述 public IPMsgMainFrm() private void initSystemTray() 初始化托盘图标。 private void init() 初始化面板。 public void actionPerformed(ActionEvent e) 按钮点击事件。 Public void tableChanged(TableModelEvent e) 内部类 private class MyWindowAdapter extends WindowAdapter 窗体关闭时触发事件。 public void windowClosing(WindowEvent e) 内部类 private class MyMouseAdapter extends MouseAdapter public void mouseClicked(MouseEvent e) 内部类 public class MyDefaultTableModel extends DefaultTableModel table的Model。 public boolean isCellEditable(int row, int column) public boolean addUser(User user) 如果行中存在user,则不添加,否则添加。 public User getRow(int n) 得到某行的User对象。 public boolean removeFromIP(String ip) 根据第3列及判断ip是否相同删除某行。 public String getIpAddress(int n) 获取某行所表示的ip地址。 内部类 private class MyDropTargetAdapter extends DropTargetAdapter 拖拽事件。 public void setSendFileList(String str) 设置传输文件列表。 public String getContent() 获取发送内容。 public String getSendList() 获取发送文件的列表。 public void clearSendList() 清空发送文件的列表。 public void clearTable() 清空table中内容。 public int[] getSelectRow() 获取选中的行。 public void clearChat() 清空聊天窗口。 类名称 ReceiveNewMSG 类描述 收到消息窗口。 描述 frm 函数描述 public ReceiveNewMSG(String time,String from,String path,String content,String ip,int port) private void init() 初始化面板。 private void initSendFile(String path) 初始化接受文件的列表。 内部类 private class MyWindowAdapter extends WindowAdapter 窗体关闭时触发事件。 public void windowClosing(WindowEvent e) public void initBtnList() 初始化接受文件内容按钮。 public void actionPerformed(ActionEvent e) 按钮点击事件。 public void setSpeed(String speed) 设置下载速度。 private boolean sureStopSend() 确认终止当前传送。 类名称 SendListDialog 类描述 准备传送文件列表窗口。 描述 frm 函数描述 public SendListDialog(Frame owner, boolean modal,boolean isShow) private void init() 初始化面板。 public void actionPerformed(ActionEvent e) 按钮点击事件。 public String getSendFile() 获取传送文件列表的文件名组成的字符串。 public String getSendPath() 获取发送的目录路径。 public String getSendList() 获取发送文件的列表。 public void clearSendList() 清空发送后的内容。 内部类 public class MyDefaultTableModel extends DefaultTableModel table的Model。 public boolean isCellEditable(int row, int column) public boolean addFile(File file) public boolean isExitFile(File file) public File getFile(int n) private void close() 窗体关闭方法。 内部类 private class MyWindowAdapter extends WindowAdapter 窗体关闭时触发事件。 类名称 ClientTCPThread 类描述 Socket网络客户端。<br> 描述 logic 函数描述 public ClientTCPThread(ReceiveNewMSG newMSG,String ip,int port,String path,String savePath) public void run() 消息内容: 类型说明: 10:客户端发送文件地址 11:客户端发送的地址有误,不予响应 20:服务端发送相对目录地址到客户端,客户端接到信息创建目录 21:服务端发送相对文件地址到客户端,客户端接到信息创建文件 22:开始发送数据,发送文件长度 31:数据发送完成 40:客户端请求暂停发送 41:客户端请求继续发送 42:服务端取消发送 90:客户端退出 91:服务端退出 92:请求数据全部发送完成. private void sendOK() 传送完成。 private String getSpeed() 获取当前速度。 private void setSpeed() 设置当前速度。 private void dealBeginSend(Object obj) 开始发送数据。 private void closeFile() 关闭文件流。 public void stopSend() 停止传送。 public void pauseSend() 暂停传送。 public void continueSend() 继续发送。 private void createFile(Object obj) 创建文件。 private void createDirectory(Object obj) 创建目录。 private void dealServerQuit() 处理服务端退出。 private void closeClient() 断开连接。 内部类 private class WriteThread extends Thread 书写线程。 public WriteThread(FSMessage message) public void run() public boolean isRun() 类名称 ServerTCPThread 类描述 ServerSocket网络服务端。<br> 描述 logic 函数描述 public void run() public void closeServer() 关闭到客户端的连接和服务器。 内部类 private class ClientThread extends Thread 客户端线程类。 public ClientThread(Socket client) public void run() 消息内容: 类型说明: 10:客户端发送文件地址 11:客户端发送的地址有误,不予响应 20:服务端发送相对目录地址到客户端,客户端接到信息创建目录 21:服务端发送相对文件地址到客户端,客户端接到信息创建文件 22:开始发送数据,发送文件长度 31:数据发送完成 40:客户端请求暂停发送 41:客户端请求继续发送 42:服务端取消发送 90:客户端退出 91:服务端退出 92:请求数据全部发送完成. 内部类 private class WriteThread extends Thread public WriteThread(Object obj) public void run() private void send(File file,String parent) throws IOException 发送文件或路径。 public void letClientQuit(int type,String msg) 使得客户端退出。 private void dealClientQuit() 客户端退出。 private void closeClient() 关闭到客户端的连接。 类名称 UDPThread 类描述 接受数据线程类。 描述 logic 函数描述 public UDPThread() private void initNet() throws UnknownHostException,IOException 初始化网络。 public void run() 发送消息: 消息类型:[hk][10]消息内容 消息说明:数据必须以[hk]开头,第二个方括号表示消息的类型,此后表示消息内容 10:新用户上线,内容格式:用户名|主机名|IP地址|登录名|优先级 11:用户下线,内容格式:IP地址 20:对发有消息、文件,内容格式:[2008-10-09 星期四 13:53:51]<[类型]?路径?文件名|[类型][路径]文件名...多个用|分割>此后显示消息内容<br>文件类型说明:0:目录;1:文件 private void dealPacket(DatagramPacket packet) 处理数据。 private void showContent(String content,String ip) 显示用户发送消息内容和目录。 private void telUserMyState(String begin,String ip) 告诉组播组内的其他用户我的状态。 private void telGroupIamOffline(String begin) 告诉组播组内的其他用户下线了。 private void telGroupIamOnline(String begin) 告诉组播组内的其他用户我的状态。 private void sendData(String content,String ip) 告诉组播组内的其他用户我上线了。 public void actionPerformed(ActionEvent e) 按钮事件。 private void addSendList(String ip) 向发送列表中添加向发送文件的列表。 public boolean isAllowSend(String ip,String path) 检测是否允许向某ip发送某文件。 public boolean deleteSendList(String ip,String path) 当发送完成某个文件后,从发送列表中删除以发送的文件。 private void showWrong(String msg,Exception e) 用JOptionPane显示错误的原因。 private void closeAll() 关闭所有开启IO。 private void closeUDP() 关闭UDP端口 private void closeIPMsg() 退出飞鸽传书。 内部类 private class MyWindowAdapter extends WindowAdapter 窗体关闭时触发事件。 public void windowClosing(WindowEvent e) 类名称 DateDeal 类描述 日期处理类。 描述 tools 函数描述 public static String getCurrentDate() 将当前日期返回"yyyy-MM-dd"的字符串表现形式。 public static String getCurrentTime() 将当前日期返回"yyyy年MM月dd日 HH:mm:ss"的字符串表现形式。 public static String getDate(Date date) 将Date的日期返回"yyyy-MM-dd HH:mm:ss"的字符串表现形式。 public static String getDate2(Date date) 根据当前日期返回不同形式的字符串形式。 public static String getAllDate(Date date) 根据当前日期返回类似:2008-10-09 星期四 13:53:51 格式的日期。 类名称 DownSpeed 类描述 下载速度类。 描述 tools 函数描述 public static String getSpeed(long totalData,long beginTime,long endTime) 根据下载的字节数和下载的时间返回合适的下载速度。 public static String getSpeed(long totalData) 返回1s中内传输的速度。 类名称 FileInfo 类描述 文件相关信息。 描述 tools 函数描述 public static String getFileLength(File file) 根据文件返回文件的大小,如1MB。 public static String getFileLength(Long length) 根据long大小返回文件的大小,如2MB。 类名称 SetFont 类描述 设置字体类。 描述 tools 函数描述 public static void setFont(Font font) 使用UIManager设置某些组件的缺省字体。 c) 效果图 五、 技术技巧提问 a) 使用组播获取组内其他用户,并显示到JTable上 继承DefaultTableModel里边定制添加用户方法 b) 给窗体添加拖拽功能 详细参考java.dnd中的类 c) 添加托盘图标 参考SystemTray和TrayIcon类。 d) 传送文件夹时的递归 思路:如果是文件传送给对方,如果是文件夹,告诉对方创建文件夹,然后递归该文件夹即可。 e) 传送过程中的暂停、停止、继续功能的实现? 参考线程。 六、 附加说明
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值