假设有如下的目录结构:
D:\TMPMULU
└─mytest
├─AnotherPackage
│ ClassPrintA.java
│ ClassPrintB.java
│
└─mytestpkg
Tj.java
Tj.java类有个main方法,并且运行的时候要调用ClassPrintA和ClassPrintB类。
源代码分别如下:
packagemytest.AnotherPackage;
publicclassClassPrintA {
publicvoidPrintA()
{
System.out.print("AAAA");
}
}
packagemytest.AnotherPackage;
publicclassClassPrintB {
publicvoidPrintB()
{
System.out.print("BBBB");
}
}
packagemytest.mytestpkg;
importmytest.AnotherPackage.*;
publicclassTj {
publicstaticvoidmain(String[] args) {
// TODO Auto-generated method stub
System.out.print("helllllllll");
ClassPrintA ca=newClassPrintA();
ca.PrintA();
ClassPrintB cb=newClassPrintB();
cb.PrintB();
}
}
现在的任务是把ClassPrintA和ClassPrintB编译打包成jar文件。
Tj类通过这个jar,一起编译。最后运行。
第一步,编译各个java类。
编译的话,不需要指定classpath。
通过命令javac编译。javac的具体参数可以下面地址查到:
在Cmd命令后,先对文件ClassPrintA和ClassPrintB编译。依次输入命令如下:
C:\Users\Administrator>"C:\Program Files\Java\jdk1.7.0_10\bin\javac.exe" D:\tmpm
ulu\mytest\AnotherPackage\ClassPrintA.java
C:\Users\Administrator>"C:\Program Files\Java\jdk1.7.0_10\bin\javac.exe" D:\tmpm
ulu\mytest\AnotherPackage\ClassPrintB.java
运行成功后,在D:\tmpmulu\mytest\AnotherPackage\目录下会有2个class文件。
第二步打包。
对这2个class文件打包,通过jar命令。Jar的使用细节,可以通过以下网址获得:
注意,jdk的版本一定要正确。32位的装32位机器,64位的装64为机器。
运行命令:
要打包成jar文件,运行命令:
C:\Users\Administrator>"C:\Program Files\Java\jdk1.7.0_10\bin\jar.exe" cvf myjar.jar
D:\tmpmulu\mytest\AnotherPackage\ClassPrintA.class D:\tmpmulu\mytest\AnotherPac
kage\ClassPrintB.class
已添加清单
正在添加: D:/tmpmulu/mytest/AnotherPackage/ClassPrintA.class(输入 = 417) (输出 =
289)(压缩了 30%)
正在添加: D:/tmpmulu/mytest/AnotherPackage/ClassPrintB.class(输入 = 417) (输出 =
289)(压缩了 30%)
最后在C:\Users\Administrator\目录下得到myjar.jar。用解压软件打开看到:
显然,jar程序会根据你输入的路径结构来打包,因此把D盘都打了进去,这一点如果使用相对路径就不是很方便,因此,重新将当前目录切换到D:\TMPMULU\,再次打包。
这次得到的jar包的目录就是相对目录了。
第三步,编译Tj文件。
由于Tj代码中引用到了ClassPrintA和ClassPrintB,因此编译的时候,要么引入jar包,要么引入文件位置,两种方式都可以。
先看第一种,引入jar包。
引入jar包,就必须指定jar包文件的位置,为了避免类文件的干扰,先把类文件删除。
下面2个命令都可以
D:\tmpmulu>"C:\Program Files\Java\jdk1.7.0_10\bin\javac.exe" -cp .\myjar.jar D:\
tmpmulu\mytest\mytestpkg\Tj.java
D:\tmpmulu>"C:\Program Files\Java\jdk1.7.0_10\bin\javac.exe" -cp d:\tmpmulu\myja
r.jar D:\tmpmulu\mytest\mytestpkg\Tj.java
在这种编译下,需要找到之前的jar包,因此通过设定环境变量。-cp .就是把环境变量设为当前路径。也可以写成绝对路径。
在没有jar包的境况下,可以通过设定环境变量,找类文件。这次,为了避免jar文件的干扰,先把jar文件删除。
D:\tmpmulu>"C:\Program Files\Java\jdk1.7.0_10\bin\javac.exe" -cp . D:\tmpmulu\my
test\mytestpkg\Tj.java
D:\tmpmulu>"C:\Program Files\Java\jdk1.7.0_10\bin\javac.exe" -cp d:\tmpmulu D:\t
mpmulu\mytest\mytestpkg\Tj.java
只要设定了环境变量,javac会从该路径找需要的类。
注意,Java中,Java类中包名必须要有对应的路径。就是说,要在某个文件夹中找到mytest.AnotherPackage.ClassPrintA这个类,必须在这个文件夹中找到mytest\AnotherPackage\ClassPrintA.class类,如果没有这样的目录结构,java认为没有找到该包,因此也没找到这样的类。因此,环境变量设为d:\tmpmulu后,在d:\tmpmulu路径下,有mytest\AnotherPackage这个的层次,因此也就能找到里面的类。
无论是引用的jar还是源文件,编译后都会在D:\tmpmulu\mytest\mytestpkg得到Tj.class。
可以尝试运行这个文件。
第四步 运行Tj类文件
运行类文件,也需要指定classpath,并且也是按照包的层次在目录结构中找类。
如果classpath指定为jar包,则不需要之前的类文件了,直接可以运行。但是要注意,类一定要按照包的层次结构放置。指定类名的时候,必须写全包名,设置环境变量的时候,注音不要漏了';'。
如下的命令:
D:\tmpmulu>java -cp d:\tmpmulu\myjar.jar; mytest.mytestpkg.Tj
helllllllllAAAABBBB
D:\tmpmulu>java -cp myjar.jar; mytest.mytestpkg.Tj
helllllllllAAAABBBB
D:\tmpmulu>java -cp .\myjar.jar; mytest.mytestpkg.Tj
helllllllllAAAABBBB
当然,如果没有jar包,那也是可以的。
直接将环境变量社会class文件所在的位置,总之一定要让java找到那些类文件。
D:\tmpmulu>java -cp . mytest.mytestpkg.Tj
helllllllllAAAABBBB
D:\tmpmulu>java -cp .\ mytest.mytestpkg.Tj
helllllllllAAAABBBB
D:\tmpmulu>java -cp D:\tmpmulu mytest.mytestpkg.Tj
helllllllllAAAABBBB
如果把运行的class移到别目录也可以,运行时只要保证java能找到那些class就行,比如,移到E:\testrun
那么首先保证类所在的位置和它的包名一致。
E:\TESTRUN
└─mytest
└─mytestpkg
Tj.class
C:\Users\Administrator>java -cp d:\tmpmulu\myjar.jar;e:\testrun\; mytest.mytest
pkg.Tj