JAVA学习笔记(一)---关于jar包运行时找不到主类

新学期开始了,这个学期要学习java,助教学长严格的给我们布置了很多作业。
于是每个星期都在疯狂的写java作业中度过,想了想还是觉得应该把遇到的问题记录下来|•ω•`)
虽然助教表示,以后每年作业都会修改,但是学的东西是一样的,说不定还能造福学弟学妹。
如果他们能找到我的博客的话ヽ( ̄ω ̄( ̄ω ̄〃)ゝ

打成可运行的jar包

第二次作业有一道题让我们学习jar包,当时在网上找了很多资料,打成jar包以后却怎么也运行不了。尝试了文章里经常出现的修改MANIFEST.MF文件,也就是在该文件里添加Main-Class语句,但依旧提示找不到主类。

重新找资料

继续搜索文档,在一篇博客里找到了直接用命令打包并指定程序入口,也就是定义Main-Class。
jar cvfe 文件名.jar 入口 所需打成jar包的文件
再运行
java -jar 文件名.jar
成功运行。

再次遇到问题

又一次的课后作业要求打成jar包,这一次的java文件里,包含主类的java文件有一个包,而主类文件调用的另一文件在另一个包内。
两个文件的代码
SunRise.java

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
package nihao;
import tom.jiafei.Trangle;
import java.util.Date;
class SunRise
{
public static void main(String args[])
{
Trangle trangle=new Trangle(12,3,104);
trangle.计算面积();
trangle.修改三边(3,4,5);
trangle.计算面积();
Date date=new Date();
System.out.println(date);
}
}

第二个文件
Tragle.java

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
package tom.jiafei;
public class Trangle
{
double sideA,sideB,sideC;
boolean boo;
public Trangle(double a,double b,double c)
{
sideA=a;sideB=b;sideC=c;
if(a>0&&b>0&&c>0&&a+b>c&&a+c>b&&b+c>a)
{
System.out.println("我是一个三角形");
boo=true;
}
else
{
System.out.println("我不是一个三角形");
boo=false;
}
}
public void 计算面积()
{
if(boo)
{
double p=(sideA+sideB+sideC)/2.0;
double area=Math.sqrt(p*(p-sideA)*(p-sideB)*(p-sideC));
System.out.println("是一个三角形,能计算面积");
System.out.println("面积是:"+area);
}
else
{
System.out.println("不是一个三角形,不 能计算面积");
}
}
public void 修改三边(double a,double b,double c)
{
sideA=a;sideB=b;sideC=c;
if(a>0&&b>0&&c>0&&a+b>c&&a+c>b&&b+c>a)
{
System.out.println("我是一个三角形");
boo=true;
}
else
{
System.out.println("我不是一个三角形");
boo=false;
}
}
}

先编译
javac Trangle.java SunRise.java
由于文件里有中文,可能会出现编码错误,所以使用下面的命令编译
javac -encoding gbk Trangle.java SunRise.java
编译完毕之后,将SunRise.class放到新建的命名为nihao的文件夹中,将Trangle.class放到新建的命名为tom的文件夹里命名为jiafei的文件夹里。
然后在nihaotom所在的文件夹里执行命令
java nihao.SunRise
就能成功运行(顺便把含包文件的编译运行方式给说了|•ω•`))

错误的打包方式
由于脑子被僵尸啃掉了,犯蠢了的我,把nihaotom放到了命名为SunRise的文件夹里,打包
jar SunRise.jar nihao.SunRise SunRise
但是之后运行却依旧显示找不到主类。各种修改入口,可还是找不到主类。

解决问题(思考,思考,思考一下)

静下心来仔细的思考了一下,以我最开始给出的打包命令为例
jar cvfe 文件名.jar 入口 所需打成jar包的文件
我以为所需打成jar包的文件只能是一个文件,或者一个包含所有需要打包的文件的文件夹。
但事实上并非如此,他可以打包多个文件。
而由于我新建了一个SunRise的文件夹,导致SunRise.class的路径出现了错误,所以也就找不到主类了
正确的打包方式
jar SunRise.jar nihao.SunRise nihao tom
java -jar SunRise.jar
成功运行。

总结

带着脑子编程是很重要的,要多种豌豆射手保护好自己的脑子|•ω•`)

-------------本文结束感谢您的阅读-------------