java之jar包

1、java程序目录

    比如对于一个最简单的项目,里面现在只包含一个public类Test,如下所示。为了避免与别人的类名有冲突,使用package添加到自己的包xu中。我们可以添加一个项目目录HelloTest,然后在项目目录下再新建两个目录sources和classes,分别存放代码文件和字节码文件,sources下再新建一个目录xu放置自己的代码文件以与别人的代码区分。

//Test.java

package xu;

public class Test
{
	public static void main(String [] args)
	{
		System.out.println("Test");
	}
}

    然后可以使用javac来生成字节码文件到classes目录下:javac -d ./classes Test.java(如果当前不在Test.java目录下的话还需要在Test.java前面添加具体路径),可以看到在classes下自动生成了包目录xu和其中的Test.class字节码文件。然后如果当前在classes下的话可以使用java xu.Test命令来运行程序,还可以将classes目录添加到CLASSPATH环境变量中,这样在任意目录下都可以执行java xu.Test。需要注意的一点是,当我们设置了CLASSPATH环境变量为某一指定目录后,java命令就会只在该目录下寻找字节码文件,所以也可以设置CLASSPATH为多个路径值,他们以分号分割,这样java命令会在多个路径下寻找字节码文件。

    如果我们再新建一个自己的public类Hello的话,同样应该使用package把它放到自己的包xu中,将源文件和字节码文件分别放置sources和classes中自己的目录下,因为Hello和Test在同一包xu中,所以Hello中可以直接使用Test类:

//Hello.java

package xu;

public class Hello
{
	public static void main(String[] args)
	{
		Test t = new Test();
		System.out.println("Hello");
	}
}

    如果其它人中代码想使用我们的类,他可以使用"import xu.*"语句来导入我们的类,假设该代码在source的lee目录下,如下所示的Foo.java。因为前面我们已经将字节码文件目录classes设置到CLASSPATH环境变量,所以该文件进行javac的话没有问题,否则会提示“import错误,xu包不存在”。其实如果我们不设置CLASSPATH环境变量的话也可以使用-classpath来指定类目录,如javac -classpath ../../classes -d ../../classes Foo.java。

//Foo.java

package lee;
import xu.*;

public class Foo
{
	public static void main(String[] args)
	{
		Test t = new Test();
		System.out.println("Foo");
	}
}

2、创建jar文件给他人使用

    jar文件就是一个压缩文件,可以把它当成一个目录,使用jar命令来生成jar文件,jar命令实际上就是一个解压缩命令,可以压缩任何目录或文件到jar文件。使用jar -cf(-cvf为显示压缩过程)来压缩文件或目录,比如jar -cf JarName.jar ClassesPath表示压缩ClassesPath目录到JarName.jar文件(jar文件在当前目录生成)。比如下面的Test类,其字节码文件在包xu中,进入包xu所在的目录,使用"jar -cf JarName.jar xu"命令将包xu生成名称为JarName的jar文件,然后其他类就可以使用这个jar文件。

比如下面的Hello类要使用刚才生成的jar包中的Test类,进入Hello类文件所在的目录,将jar文件放到该目录下,然后就可以执行javac -cp jarName.jar Hello.java,java -cp.;jarName.jar Hello。也可以将CLASSPATH环境变量设置为jar文件的全路径(包括.jar扩展名)。

//Test.java
package xu;

public class Test
{
	public void func()
	{
		System.out.println("Test");
	}
}

//Hello.java
import xu.Test;

public class Hello
{
	public static void main()
	{
		Test t = new Test();
	}
}

  也可以使用--create --file来替换-cf,不过必须加上-c来指定要压缩的文件或目录,比如jar --create --file JarName.jar -c xu。

3、生成可执行的jar文件

    比如对于以下的Test.java文件,其类文件在包xu中,所以我们进入xu所在的目录,使用"jar -cfe(cvfe:显示压缩过程) + jar文件名 + 可执行类名 + 可执行类所在的目录名(包名)"来生成可执行jar,如jar -cfe JarName.jar xu.Test xu,运行可执行jar文件使用java -jar JarName.jar。

//Test.java
package xu;

public class Test
{
	public static void main(String[] args)
	{
		System.out.println("Test");
	}
}

  如果使用--create --file的话,那么使用--main-class来生成可执行的jar,如jar --create --file JarName.jar --main-class xu.Test -c xu。

4、多版本的jar

  可以将不同JDK版本生成的字节码压缩到一个jar文件中,比如classes中的xu为JDK8生成的包,mods中的xu为JDK9生成的包,使用 jar --create --file JarName.jar -c classes/xu --release 9 -c mods/xu生成的jar包,在JDK8下使用这个包就会使用JDK8生成的xu,在JDK9下使用这个包就会使用JDK9生成的xu。

5、清单文件

    jar文件其实就是ZIP压缩文件,可以使用其他的命令或工具压缩或解压缩jar文件,使用其他工具比如ZIP解压缩软件来生成jar文件时需要手动添加META-INF目录,并在其中添加MANIFEST.MF清单文件。清单文件中至少包含以下前两行的内容:

Manifest-Version: 1.0
Created-By: 10.0.1 (Oracle Corporation)
Main-Class: xu.Test

    清单文件中数据为key-value对形式,每行只能定义一个key-value对,key和value以‘:’+''(空格)形式存在(结尾无分号),文件最后必须为一个空行。

6、jar命令总结:

    生成jar包:jar cf/cvf JarFileName.jar ClassFolderName
    不生成清单文件:jar jar cvfM JarFileName.jar ClassFolderName
    增加清单文件中内容:jar cvfm JarFileName.jar MyManifest.mf ClassFolderName
    查看jar包中文件列表(支持使用>重定向):jar tf JarFileName.jar
    解压缩jar包中文件到当前目录:jar xf JarFileName.jar
    更新jar包中文件:jar uf JarFileName.jar ClassName.class
    生成可执行的jar包:jar cvfe JarFileName.jar ClassFolderName.MainClassName ClassFolderName
    执行可执行的jar包:java -jar JarFileName.jar

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值