平时用maven等工具打包打习惯了,于是想到,如果自己用命令行打一个java包 应该如何做,思路如下:
①写一个类带有主函数
②使用javac编译
③使用java命令运行
1.首先我们需要一个class类ServerSocketMain.java(这是一个写着玩的类):
package com.test.socket;
import java.io.BufferedReader;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.net.ServerSocket;
import java.net.Socket;
/**
* @Author: lenglengliang
* @Description: com.test.socket
* @Date: Create in 2021-01-29 1144
*/
public class ServerSocketMain {
public static void main(String[] args) {
try {
ServerSocket socket = new ServerSocket(57656);
System.out.println("bind 57656 port success");
while (true)
{
Socket accept = socket.accept();
System.out.println("client connected:");
InputStream inputStream = accept.getInputStream();
BufferedReader bufferedReader = new BufferedReader(new InputStreamReader(inputStream));
String temp =null;
while ((temp = bufferedReader.readLine()) !=null)
{
System.out.println(Thread.currentThread()+"msg:"+temp);
}
}
} catch (Exception e) {
System.out.println(e.getMessage());
}
}
}
很简单的一个类,使用ServerSocket绑定端口并等待客户端连接
下面使用javac进行编译:
D:\WorkSpaces\Java\SelfDone\MybatisTest\src\main\java\com\test\socket>javac ServerSocketMain.java
ServerSocketMain.class是我们编译好的class文件
D:\WorkSpaces\Java\SelfDone\MybatisTest\src\main\java\com\test\socket>dir
驱动器 D 中的卷是 Data
卷的序列号是 BA64-B834
D:\WorkSpaces\Java\SelfDone\MybatisTest\src\main\java\com\test\socket 的目录
2021/01/29 12:31 .
2021/01/29 12:31 ..
2021/01/29 12:01 209 ClientSocketMain.java
2021/01/29 14:42 1,458 ServerSocketMain.class
2021/01/29 12:31 1,122 ServerSocketMain.java
3 个文件 2,789 字节
2 个目录 301,437,841,408 可用字节
D:\WorkSpaces\Java\SelfDone\MybatisTest\src\main\java\com\test\socket>
有了ServerSocketMain.class 我们可以使用java命令执行
注意class文件名不用加.class后缀
D:\WorkSpaces\Java\SelfDone\MybatisTest\src\main\java\com\test\socket>java ServerSocketMain
错误: 找不到或无法加载主类 ServerSocketMain
方案1:检查classpath是否有当前目录".;"的环境变量(我们遇到的错误和此项无关)
方案2:java 执行路径的错误,我们写的ServerSocketMain.java所在路径为:
D:\WorkSpaces\Java\SelfDone\MybatisTest\src\main\java\com\test\socket>
由于我们定义项目源文件夹Sources
我们的.java文的package为
package com.test.socket;
其实java命令执行class文件需要文件的完全限定名称,也就是需要执行
java com.test.socket.ServerSocketMain
注意没有.class后缀,结果是
D:\WorkSpaces\Java\SelfDone\MybatisTest\src\main\java\com\test\socket>java com.test.socket.ServerSocketMain
错误: 找不到或无法加载主类 com.test.socket.ServerSocketMain
还是报错,因为此目录下无法按照包名com.test.socket去寻找class文件,包名在查找时会映射成目录名(猜的)
我们cd回Souces文件所在目录:
D:\WorkSpaces\Java\SelfDone\MybatisTest\src\main\java>
执行
D:\WorkSpaces\Java\SelfDone\MybatisTest\src\main\java>java com.test.socket.ServerSocketMain
bind 57656 port success
成功打印并已阻塞进程(因为在等待socket连接嘛)
此时,我们已经能成功执行class文件,思考下,如果想把class文件变成一个jar文件该如何做?
我们尝试思路:
①.将ServerSocketMain.class放到文件目录xxx/com/test/socket/下,因为class仍然需要一个完整的类路径,通过以往经验,看到jar包中一般都会包含包名的文件夹层级
②.使用jar命令打包
C:\Users\lenglenglinag\Desktop\打包目录>jar -cvf first.jar com
已添加清单
正在添加: com/(输入 = 0) (输出 = 0)(存储了 0%)
正在添加: com/MANIFEST.MF(输入 = 115) (输出 = 106)(压缩了 7%)
正在添加: com/test/(输入 = 0) (输出 = 0)(存储了 0%)
正在添加: com/test/socket/(输入 = 0) (输出 = 0)(存储了 0%)
正在添加: com/test/socket/ServerSocketMain.class(输入 = 1458) (输出 = 819)(压缩了 43%)
cvf中c是创建新目录,v是标准输出,f是指定的文件夹
详情见
-c 创建新档案
-t 列出档案目录
-x 从档案中提取指定的 (或所有) 文件
-u 更新现有档案
-v 在标准输出中生成详细输出
-f 指定档案文件名
-m 包含指定清单文件中的清单信息
-n 创建新档案后执行 Pack200 规范化
-e 为捆绑到可执行 jar 文件的独立应用程序
指定应用程序入口点
-0 仅存储; 不使用任何 ZIP 压缩
-P 保留文件名中的前导 '/' (绝对路径) 和 ".." (父目录) 组件
-M 不创建条目的清单文件
-i 为指定的 jar 文件生成索引信息
-C 更改为指定的目录并包含以下文件
我们得到了jar包
赶紧兴冲冲的执行:
C:\Users\yangzhi\Desktop\打包目录>java -jar first.jar
first.jar中没有主清单属性
没有主清单的属性,我们用压缩软件打开这个jar包,看到如下目录:
META-INF中包含了一个文件MANIFEST.MF,这是提示中的主清单,里面描述了这个jar包的基本信息,犹如一个身份证
Manifest-Version: 1.0
Created-By: 1.8.0_181 (Oracle Corporation)
是这里少一个属性:
Main-Class: com.test.socket.ServerSocketMain
这是一个启动类 就像maven中配置的一样
写的时候需要注意:
Main-Class: com.test.socket.ServerSocketMain
冒号是英文,冒号后面需要加空格,行后加回车 不然还会报没有主清单属性
C:\Users\yangzhi\Desktop\打包目录>jar -cvfm first.jar MANIFEST.MF com
已添加清单
正在添加: com/(输入 = 0) (输出 = 0)(存储了 0%)
正在添加: com/MANIFEST.MF(输入 = 111) (输出 = 103)(压缩了 7%)
正在添加: com/test/(输入 = 0) (输出 = 0)(存储了 0%)
正在添加: com/test/socket/(输入 = 0) (输出 = 0)(存储了 0%)
正在添加: com/test/socket/ServerSocketMain.class(输入 = 1458) (输出 = 819)(压缩了 43%)
C:\Users\yangzhi\Desktop\打包目录>java -jar first.jar
bind 57656 port success
舒服,后面我有可能在出一版带三方依赖的打包...写博客时间过的好快...