例1:D盘的java_src/pro文件夹下有文件夹classes和src,src下的文件夹为org/xalg,其中xalg下又有两个文件夹,分别为good和test。在good文件夹下有一个源代码文件为Good.java,其内空为
在test文件夹下,有一个源代码文件为HelloWorld.java,内容为
文件结构图如下:
因为HelloWorld.java引用了Good.java,所以要先编译Good,在pro目录下执行
javac -d classes src\\org\\xalg\\good\\Good.java
-d classes和Good.java源代码中的包名共同组成了Good.class生成的位置,可以发现在classes文件夹上生成了org\\xalg\\good\\Good.class
再编译HelloWorld.java,在pro下执行
javac -d classes -cp classes src\\org\\xalg\est\\HelloWorld.java
-d classes和HelloWorld.java源代码中的包名共同组成了HelloWorld.class生成的位置,可以发现在classes文件夹上生成了org\\xalg\est\\HelloWorld.java。-cp classes指定了编译HelloWorld.java时要引用的Good.class的位置,因为刚才的Good.class生成到了classes中,故写成-cp classes
编译完毕,执行命令为:
java -cp classes org.xalg.test.HelloWorld
-cp指定了运行此程序要用到的所有字节码(.calss)文件的位置,而org.xalg.test.HelloWorld指的是含有main()函数的字节码是org.xalg.test.HelloWorld,编译运行的截图如下:
将程序打包成jar包要先写的一个文本文件,指示main()函数所在类,如下
注意冒号后面要有一个空格,HelloWorld后面不能有空格,最后要以空行结束。将文本文件Manifest.txt放在例1中的classes文件夹下(和包org在同一个目录),如下图
在文件夹classes下执行
jar cfm combine.jar Manifest.txt org\\xalg\\good\\Good.class org\\xalg\est\\HelloWorld.class
其中cfm中的c意思是创建新的压缩文件, cfm中的f意思是指定压缩文件的名称,cfm中的m意思是包含指定清单文件中的清单信息,就是指的Manifest.txt中的信息,整个命令的意思是将Good.class和HelloWorld.class打包成combine.jar,在Manifest.txt中指定了main()函数所在的类.
运行此jar包,执行命令:
java -jar combine.jar
运行命令的截屏为:
例2 :引用已有的jar包,并且再次打包成一个jar包。现在如下结构的文件夹,
文件夹classes为空,文件夹jar里面有一个连接mysql需要的jar包,mysql-connector-java-5.1.18-bin.jar,src文件夹下有文件夹org\\xalg\\conn,conn下有一个连接mysql的源代码JDBCMysql.java,内容为
package org.xalg.conn;
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.ResultSet;
import java.sql.Statement;
public class JDBCMysql {
public static void main(String[] args) {
try {
Class.forName(\"com.mysql.jdbc.Driver\");
} catch (ClassNotFoundException ex) {
ex.printStackTrace();
}
Connection conn = null;
Statement stmt = null;
ResultSet rs = null;
try {
conn = DriverManager
.getConnection(
\"jdbc:mysql://localhost:3306/cover?useUnicode=true&characterEncoding=UTF-8\
\"root\
stmt = conn.createStatement();
stmt.executeUpdate(\"insert into StuTable(StuNum, StuName, StuMark)values ('3','a1234',20)\");
rs = stmt.executeQuery(\"select * from StuTable\");
while (rs.next()) {
System.out.println(\"StuNum=\" + rs.getInt(\"StuNum\"));
System.out.println(\"StuName=\" + rs.getString(\"StuName\"));
System.out.println(\"StuMark=\" + rs.getInt(\"StuMark\"));
}
} catch (Exception ex) {
ex.printStackTrace();
} finally {
try {
if (rs != null) {
rs.close();
}
if (conn != null) {
conn.close();
}
} catch (Exception ex) {
ex.printStackTrace();
}
}
}
}
进入test4对其编译,执行:
D:\est4\\classes>javac -d classes -cp jar\\mysql-connector-java-5.1.18-bin.jar src\\org\\xalg\\conn\\JDBCMysql.java
-d classes作用见例1,编译时要引用jar包,-cp
jar\\mysql-connector-java-5.1.18-bin.jar就指定了jar包.
运行时执行命令:
D:\est4>java -cp classes;jar\\mysql-connector-java-5.1.18-bin.jar
org.xalg.conn.JDBCMysql
其中-cp 后的classes;jar\\mysql-connector-java-5.1.18-bin.jar指定了运行此程序要用到的.class文件(.jar是打包后的.calss文件),org.xalg.conn.JDBCMysql指定了main函数所在的.class文件,命令截屏为
例3.打包已有的jar包
接上面的例子,将mysql-connector-java-5.1.18-bin.jar复制到calsses文件夹下,在classes文件夹下建文件文件Manifest.txt,内容如下
注意每个冒号后面要跟一个空格,每行最后不能有空格,文件最后要以空行结束。
编译,运行命令jar cfm MyJar.jar Manifest.txt org\\xalg\\conn\\JDBCMysql.class
执行,运行命令java -jar MyJar.jar
命令截图为:
点击这里进入源代码下载页面.
参考资料:
1. Java programming package classpath
2. Oracle官方教程(配制部分)
有问题可以联系zhouyang209117@sina.com
2012年11月13日