package首字母小写!
public首字母小写!
1.文件目录和源代码
在D盘中新建test文件夹,在test文件夹下新建如上四种成分,其中foo文件夹为空
三个java文件的源代码如下所示:
Main.java
package cn.mymain;
import cn.mytest1.Test1;
import cn.mytest2.Test2;
public class Main{
public static void main(String[] args){
for(String item:args){
System.out.println("parameters are:"+item);
}
Test1 t1=new Test1();
Test2 t2=new Test2();
t1.say();
t2.say();
}
}
Test1.java
package cn.mytest1;
public class Test1{
public static void main(String[] args){
}
public void say(){
System.out.println("I am Test1!");
}
}
Test2.java
package cn.mytest2;
public class Test2{
public static void main(String[] args){
}
public void say(){
System.out.println("I am Test2!");
}
}
接下来开始编译
2.利用javac指令编译源文件为class文件
D:\test>javac -d ./foo Test1.java
D:\test>javac -d ./foo Test2.java
-d ./foo 指定生成的class文件的路径
比如Test1.java中的package cn.mytest1;
那么编译之后就会在foo文件夹下生成cn文件夹,cn文件夹下回生成mytest1文件夹,
最后的Test1.class保存在mytest1文件夹中
如下图所示:
Tess2.java以此类推
但是当我对Main.java进行上述编译时
报了相关错误:
D:\test>javac -d ./foo Main.java
Main.java:2: 错误: 程序包cn.mytest1不存在
import cn.mytest1.Test1;
^
Main.java:3: 错误: 程序包cn.mytest2不存在
import cn.mytest2.Test2;
^
Main.java:9: 错误: 找不到符号
Test1 t1=new Test1();
^
符号: 类 Test1
位置: 类 Main
Main.java:9: 错误: 找不到符号
Test1 t1=new Test1();
^
符号: 类 Test1
位置: 类 Main
Main.java:10: 错误: 找不到符号
Test2 t2=new Test2();
^
符号: 类 Test2
位置: 类 Main
Main.java:10: 错误: 找不到符号
Test2 t2=new Test2();
^
符号: 类 Test2
位置: 类 Main
6 个错误
一句话,找不到class在哪
通过查看相关博客
我尝试使用classpath(即class的path,亲身经历印象更深刻)
D:\test>javac -classpath ./foo -d ./foo Main.java
D:\test>
我觉得classpath的作用就是引导编译器去哪里寻找程序中需要用到的class文件
我这里之所以用./foo
是因为Test1.class和Test2.class的全称(如cn.mytest1.Test1和cn.mytest2.Test2)都在其下
3.利用jar命令打包
step1:先在java文件同级目录新建MANIFEST.MF文件
输入如下字符:
Manifest-Version: 1.0
Created-By: 10.0.2 (Oracle Corporation)
Main-Class: cn.mymain.Main
MANIFEST.MF文件最后一行是空行
用记事本看不出来
用notepad++即可
step2:开始打包
D:\test>jar cvfm test.jar MANIFEST.MF -C foo/ .
已添加清单
正在添加: cn/(输入 = 0) (输出 = 0)(存储了 0%)
正在添加: cn/mymain/(输入 = 0) (输出 = 0)(存储了 0%)
正在添加: cn/mymain/Main.class(输入 = 1079) (输出 = 621)(压缩了 42%)
正在添加: cn/mytest1/(输入 = 0) (输出 = 0)(存储了 0%)
正在添加: cn/mytest1/Test1.class(输入 = 471) (输出 = 307)(压缩了 34%)
正在添加: cn/mytest2/(输入 = 0) (输出 = 0)(存储了 0%)
正在添加: cn/mytest2/Test2.class(输入 = 471) (输出 = 307)(压缩了 34%)
从效果来看把foo文件夹下的所有的东西和MANIFEST.MF一起打包成test.jar文件
test.jar文件保存在当前目录
step3: 测试jar包是否可以运行
D:\test>java -jar test.jar
I am Test1!
I am Test2!
D:\test>java -jar test.jar 1 2 3 4
parameters are:1
parameters are:2
parameters are:3
parameters are:4
I am Test1!
I am Test2!
D:\test>
4.java程序调用其他的jar包
step1:
编写源代码Extra1.java,调用jar包中的类 Test1
package china.myextra1;
import cn.mytest1.Test1;
public class Extra1{
public static void main(String[] args){
Test1 t1=new Test1();
t1.say();
}
}
step2:
编译该代码
D:\test\Extra>javac -cp ../test.jar -d . Extra1.java
cp必须要加,否则就不知道在找class
在Extra.java同级文件夹生成china文件夹,china文件夹下生成myextra1文件夹,
myextra1文件夹下生成Extra1.class
step3:
运行该代码
D:\test\Extra>java -cp ../test.jar; china.myextra1.Extra1
I am Test1!
上面的分号必须要加上,否则就报错
上面的cp也得加上,否则也报错
上面的类名得用完整名称,否则也报错
路径图如下所示: