编译
javac 命令用于编译Java源文件,语法为:`javac [ options ] [ sourcefiles ]
如下示例:
1 | $ javac Main.java |
其中 options 的主要选项有:
-sourcepath <path>
指定 Java 源文件的路径- ``
注意事项
- 一个
java
文件中可以有多个类,但是只能有一个用public
修饰的类,并且这个类的名字要和java
文件的名字相同(区分大小写)。 - 如果整个文件都没有
public
类,则文件名可以与所有类不相同。
运行
Java程序运行必须指定一个带有main
函数的main class
。
java 运行
一个工程打成jar包后,可以使用java -jar
命令运行。
1 | $ java -jar test.jar |
如果这个jar包中引用了其他第三方的jar包,可能会出现 NoClassDefFoundError
的错误。
1 | Exception in thread "main" java.lang.NoClassDefFoundError: org/apache/log4j/Logger |
解决方法有四种种。
第一种 -Xbootclasspath
在运行的时候可以使用如下的参数
-Xbootclasspath:
完全取代系统Java classpath。不建议这么使用,最好是不用。-Xbootclasspath/a:
在系统的Java classpath后附加,一般用这个。-Xbootclasspath/p:
在系统的Java classpath前附加,注意使用,可能会造成与系统包冲突。
1 | $ java -Xbootclasspath/a:lib/metrics-core-2.2.0.jar:lib/slf4j-api-1.7.2.jar -jar target/learn-metrics-1.0.jar |
第二种,使用-cp
参数,指定目录和jar包的搜索路径。不支持通配符,需要列出所有的jar包。
1 | $ java -Djava.ext.dirs=~/lib:/project/lib -cp /project/lib com.edulinks.Main |
在使用 -cp
参数指定目录时,尽量使用绝对目录,作者在使用相对路径时,曾经遇到过 java.lang.NoClassDefFoundError
的错误,为这个问题查了好久,换成绝对路径后问题就解决了。
第三种修改MANIFEST。
第四种使用自定义的Classloaer。