Java基础打包以及批处理命令运行
1.前期准备
Demo1.java
package packageJava.test; public class Demo1 { public static void main(String[] args) { System.out.println("Test!!!!!!!!!!!!!"); } }
2.将上述java文件考到文件夹下面
3.命令行编译及运行文件
编译java文件的时候:
javac -d . xxx.java
结果:
运行文件:(这时候要加上包名)
如果以UTF-8编译文件:
javac -encoding utf-8 MyDay.java
如果想在编译的时候直接生产package目录,可以采用如下命令: (注意有个点)
C:\Users\Administrator\Desktop\新建文件夹 (2)> javac -d . test.java C:\Users\Administrator\Desktop\新建文件夹 (2)> java test.test test
结果会自动生成package目录结构,并且将test.class生成到对应的文件夹下面。
4.打包文件
0.查看jar命令的参数
C:\Users\liqiang\Desktop>jar 用法: jar {ctxui}[vfm0Me] [jar-file] [manifest-file] [entry-point] [-C dir] file s ... 选项包括: -c 创建新的归档文件 -t 列出归档目录 -x 从档案中提取指定的 (或所有) 文件 -u 更新现有的归档文件 -v 在标准输出中生成详细输出 -f 指定归档文件名 -m 包含指定清单文件中的清单信息 -e 为捆绑到可执行 jar 文件的独立应用程序 指定应用程序入口点 -0 仅存储; 不使用情况任何 ZIP 压缩 -M 不创建条目的清单文件 -i 为指定的 jar 文件生成索引信息 -C 更改为指定的目录并包含其中的文件 如果有任何目录文件, 则对其进行递归处理。 清单文件名, 归档文件名和入口点名称的指定顺序 与 'm', 'f' 和 'e' 标记的指定顺序相同。 示例 1: 将两个类文件归档到一个名为 classes.jar 的归档文件中: jar cvf classes.jar Foo.class Bar.class 示例 2: 使用现有的清单文件 'mymanifest' 并 将 foo/ 目录中的所有文件归档到 'classes.jar' 中: jar cvfm classes.jar mymanifest -C foo/ .
1.打包普通的jar包
命令: jar cvf test.jar packageJava
结果:
进入jar文件修改配置:(Main-Class:后面有空格)
补充:打指定目录的包的命令如下,例如classes目录下也有一些xml,如果直接打包的话会将xml也打进去,下面不会进去:
Administrator@MicroWin10-1535 MINGW64 /e/xiangmu/zdconpro/build/classes $ pwd /e/xiangmu/zdconpro/build/classes Administrator@MicroWin10-1535 MINGW64 /e/xiangmu/zdconpro/build/classes $ ls ebuy.properties zd/ Administrator@MicroWin10-1535 MINGW64 /e/xiangmu/zdconpro/build/classes $ jar cvf commons-sync-jetty.jar ./zd/
会将zd目录以及子目录打进去,结构如下:
2.打包war包与解压war包:(重要)
1.打包: 进入到项目外层目录,例如当前目录的jwxt是一个完整的web项目,打包命令如下:
$ ls jwxt/ jwxt.war Spring_Struts_Mytatis/ SpringBootJwxt/ SSM/ TTT/ liqiang@root MINGW64 /e/IDEAWorkSpace $ jar cvfM0 jwxt.war ./jwxt/
2.解压包
jar -xvf ./jwxt.war
5.编写批处理文件运行jar包
运行效果;
6.将编译后的文件添加到压缩文件运行
运行方式一:(set classpath对于本次窗口有效,设置classpath)
运行方式二:
清空classpath
运行:(java -classpath; test.zip xx.xx.xxx 仅对于本次命令有效)
总结:
运行方式:(也就是发布项目的两种方式)
1. 打包成jar后用批处理文件运行jar包
打包命令: jar cvf test.jar packageName
解释:将编译后的packageName文件夹打包成test.jar
注意:打包完成后要进入jar包修改主类入口
bat运行命令:java -jar test.jar
2.将编译后的文件夹放入zip文件夹,通过设置classpath运行zip中的class文件。
bat命令:
第一种:set classpath=test.zip
java package.mainJava
第二种: java -classpath .\test.zip; package.mainJava
解释:加分号表示在test.zip找不到也回到当前文件夹下面找。
批处理文件进去的默认工作目录就是所在空间
常用批处理命令:
附上自己的练习的命令:
@Echo off rem call start-server start E:\酷狗\KGMusic\KuGou.exe start E:\Eclipse\eclipse\eclipse.exe start E:\hbuilder1\HBuilder\HBuilder.exe rem 打开桌面上的eclipse,HBuilder,酷狗音乐。 E: cd php\Test\第一个html start 界面.html rem 进入E盘打开自己设计的网页 cd E:\program files (x86)\Bin start QQ.exe rem 进入E盘打开自己腾讯QQ rem start E:\搜狗浏览器\SogouExplorer\SogouExplorer.exe rem start E:\fire\firefox.exe rem 这是注释,echo off是以后的命令均不显示,pause是暂停,等待用户按键后继续。用echo是在dos界面显示字符 rem cd desktop if exist 1.bat start 酷狗音乐 rem 这是注释,echo off是以后的命令均不显示,pause是暂停,等待用户按键后继续。用echo是在dos界面显示字符。上面是若果存在1.bat就打开酷狗音乐 goto next :next echo 不存在名为1.bat的文件 rem 调到goto指定的标号命令 :next表示标号 rem for %%c in (*.bat *.txt) do type %%c rem 读取索要.bat文件 set var=我是变量 echo %var% rem set设置变量,取变量时变量名前后都要加% set var1=1122 set var1=%var1:11=22% echo %var1% rem 将变量var1中的11替换为22 set var2=123456789 echo %var2:~0,5% rem 这是从变量的从第一位开始,显示之后的五位(%var:~1,5的用法) set var=123456789 echo %var:~-5% rem 这是从变量的最后五位显示出来 set var3=123456789 set var3=%var:~3% echo %var1% rem 这是从变量的第四位开始的显示出来 set var4=123456789 echo %var4:~,3% rem 这是从变量的从第0位开始,显示之后的3位 rem set /p var=请输入变量的值: rem echo %var% rem 请输入变量是提示符,输入的字符为var变量的值 set var5=123456789 set/a var6=%var5%*2 echo %var1% rem /a是变量可以进行运算,变量var6=变量var5*2 set "CURRENT_DIR=%cd%" rem 将当前驱动器目录赋值给变量CURRENT_DIR,%cd%是当前目录的值 @ECHO OFF ECHO. ECHO The first parameter is %1 ECHO The second parameter is %2 ECHO The third parameter is %3 rem 参数的使用,文件名是1.bat,在cmd中输入1 2 3 4;%1就是取文件名后第一个字符,也就是2,依次类推%2是取文件名后第二个字符。
补充:打包带有主类而且有依赖第三方jar包的类: (自定义清单打包)
目录结构如下:
1.用Eclipse打包的时候选择Main-Class,打出的包结构解压后如下:
2.查看META-INF\MANIFEST.MF清单文件:
Manifest-Version: 1.0 Main-Class: cn.qlq.LogTest
.classpath文件内容如下:
<?xml version="1.0" encoding="UTF-8"?> <classpath> <classpathentry kind="src" path="src"/> <classpathentry kind="lib" path="lib/log4j-1.2.16.jar"/> <classpathentry kind="lib" path="lib/slf4j-log4j12-1.5.10.jar"/> <classpathentry kind="lib" path="lib/slf4j-api-1.5.10.jar"/> <classpathentry kind="con" path="org.eclipse.jdt.launching.JRE_CONTAINER/org.eclipse.jdt.internal.debug.ui.launcher.StandardVMType/JavaSE-1.7"> <attributes> <attribute name="owner.project.facets" value="java"/> </attributes> </classpathentry> <classpathentry kind="output" path="bin"/> </classpath>
3.现在我们手动编写清单文件还原jar包:
清单文件必须以空行结束,而且值是key: value形式,冒号后面必须有一个空格。
其包含的主要属性如下:
(1)版本:一般是定值
Manifest-Version: 1.0
(2)主类
Main-Class: cn.qlq.Main
这个是以java -jar xxx.jar的时候会运行cn.qlq.Main类的main方法。
(3) 类路径
您可以在其清单文件中为JAR文件设置CLASSPATH。属性名称称为“类路径”,您必须在自定义清单文件中指定。它是一个空格分隔的jar文件,zip文件和目录的列表。清单文件中的Class-Path属性看起来像
Class-Path: Main.jar file:/c:/book/ //www.w3cschool.cn/tutorial.jar
上面的条目有三个CLASSPATH项目:一个JAR文件Main.jar,一个使用文件协议文件的目录:/ c:/ book /和另一个使用HTTP协议的JAR文件//www.w3cschool.cn/tutorial.jar。
目录名称必须以正斜杠结尾。假设此类路径设置包含在test.jar文件的清单文件中。当使用以下java -jar xxx.jar 文件时,此CLASSPATH将用于搜索和加载类。
4. 针对上面文件建立的清单文件如下: 最后有一个空行
Manifest-Version: 1.0 Class-Path: lib/log4j-1.2.16.jar lib/slf4j-api-1.5.10.jar lib/slf4j-log4j12-1.5.10.jar Main-Class: cn.qlq.LogTest
设置Class-Path的注意:
- 每一个包名前有一个空格
- 换行时,上一行的末尾要有一个空格
可以用如下代码生成:
File file = new File("lib"); for (File f : file.listFiles()) { System.out.println(" " +"lib/"+ f.getName() + " "); }
5. 打包以及测试:
最终目录如下:
打包:
jar cvfm ./xxx.jar .\MANIFEST.MF ./
运行:
C:\Users\Administrator\Desktop\新建文件夹 (3)> java -jar .\xxx.jar log4j:ERROR Could not find value for key log4j.appender.file log4j:ERROR Could not instantiate appender named "file". 2019-04-19 12:04:34 [cn.qlq.LogTest]-[INFO] test -> 12