前言

以前只简单了解过javac,现在重新学习java程序的编译运行,特此记录一下。


一、Java程序编译

使用javac会默认编译到同一个文件目录,要想进行不同目录的编译需要执行以下命令:
-d <目录> //指定放置生成的类文件的位置

1.无包名的类编译:
javac -d target src/Hello.java //target为<想要存放class的目录>,src为<存放java文件的目录>

2.有包名的多个类编译:
javac -d target src/Hello.java src/start/World.java -encoding utf-8
(package start;)

3.使用第三方jar包的类编译:
javac -d target src/rand/Rand.java -encoding utf-8 -classpath lib/*

在这里插入图片描述

二、构建jar包

1.不指定MANIFEST.MF构建jar包
jar -cvfe abc.jar start.World -C target/ .
(c创建v详细输出f指定jar包名称e指定入口类)
(-C xx/ .切换到xx目录并将目录下所有东西打包)
(打包成功后会自动生成一个只有入口类没有搜索路径的MANIFEST.MF文件)

jar -cvf rand.jar -C target/ rand/Rand.class
(打包成功后自动生成一个空的MANIFEST.MF文件)

2.指定MANIFEST.MF构建jar包
jar -cvfm rand.jar META-INF/MANIFEST.MF -C target/ rand/Rand.class
(META-INF目录中带有自定义的MANIFEST.MF文件)

MANIFEST.MF文件

在这里插入图片描述
(MANIFEST.MF文件的编写,冒号后面要有空格,最后一行必须回车!)

Class-Path:
应用程序或者类装载器使用该值来构建内部的类搜索路径,注意:只有此处不能使用通配符lib/*.jar或lib/*
Main-Class:
定义jar文件的入口类,该类必须是一个可执行的类,一旦定义了该属性即可通过java -jar x.jar来运行该jar文件

三、执行jar包

1.jar包中MANIFEST.MF指定了Main-Class和Class-Path:
java -jar rand.jar

2.jar包中MANIFEST.MF未指定某一项或者两者都未指定:
windows
java -cp rand.jar;lib/* rand.Rand
linux
java -cp rand.jar:lib/* rand.Rand

(命令行中入口类不可少,哪怕MANIFEST.MF文件中已指定)

说明

-cp为-classpath的缩写
注意区分三-2中windows下为分号; linux下为冒号:


版权声明:本文为hsdmw123原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
原文链接:https://blog.csdn.net/hsdmw123/article/details/124714099