涉及到的编译和打包问题
1.类在包中,如何批量编译包中的类
2.访问数据库要用到 驱动jar包,如何正确将驱动jar包也合并到自己定义的jar包中,而每次执行不需要额外的配置
环境 JDK 1.6 数据库SQL SERVER 2005 jar包 sqljdbc.jar
要求 登录名和密码为 sa,sa , 所有内容都在最后附件中(包含截图,数据库,源码,SQL jar) 可下载尝试
第一部分是图片和步骤说明,特地截图一步一步说明,第二部分是源码贴出,有几个简单的类都在staff包中.
先看第一部分:
1)目录说明:
D:\com 目录下存放我的源代码,这些源代码的包都是 package staff;从源码可以看到.
2)因为需要用到SQL SERVER2005的驱动,因此把sqljdbc.jar也放入 d:\com目录下,并点击右键解压缩(就如同解压.rar文件一样),就能看到有一个 sqljdbc的文件产生
3)sqljdbc文件夹中有一个com文件夹,把com文件夹剪切出来 放到源码区(即d:\com目录下)
说明sqljdbc文件下的com文件夹很显然就是com.microsoft.sqlserver.jdbc 的根目录,最底下 全是.class文件 .
4)在D:\com 目录源码区 再创建一个名称为 menifest的文件,注意不需要后缀
5)用编辑工具打开 menifest ,加入下面内容
staff.MainMenu 表示staff包下的MainMenu类是含有main方法的程序启动类
注意: main-class: 冒号后空一格再写 staff.MainMenu
且 写完第一行后换行 第二行再空一行 让光标能落在第三行的位置,也就是说第一行后要空一行(至于为什么我也没有深究,有时效果没有出来,查了查就发现是这里的问题)
6)写好menifest文件后,就可以进入 cmd窗口 键入以下如图所示的内容,我会说明每一个步骤是做什么的,且将输出何种效果
7)cd /d d:\com 进入D盘com文件夹下的源码区
d:\com>javac -d d:/com *.java
(javac)编译 d:\com目录下 所有的.java源文件 -d d:/com 是指定编译后产生的.class 文件都输出到 d:/com 目录下
经过上面这个步骤,观察d:/com 目录就会发现 多了一个 staff文件夹,这是编译好后生成的 staff包文件夹,staff文件夹下就是每个源码对应生成的 .class文件了。
最后一个动作,其实就是将com目录..子目录下..目录下 和 staff目录下的.class文件打包成 .jar文件
jar cvmf menifest lvp.jar com/microsoft/sqlserver/jdbc/*.class staff/*.class
jar 是打包命令 menifest 就是刚才我们自己编写的一个文件 lvp.jar是要输出生成的jar包名称 ,com/microsoft/sqlserver/jdbc/*.class 空格 staff/*.class 是指要打包的.class文件
经过这一步就已经完成了最终的打包动作.
8)执行的看看
通过 java -jar lvp.jar 就可以执行了! 也不会出现因为 sqljdbc.jar找不到而引起的 com.microsoft.sqlserver.jdbc.SQLServerDriver 驱动类无法加载的异常了!
列出一部分测试源码
1.类在包中,如何批量编译包中的类
2.访问数据库要用到 驱动jar包,如何正确将驱动jar包也合并到自己定义的jar包中,而每次执行不需要额外的配置
环境 JDK 1.6 数据库SQL SERVER 2005 jar包 sqljdbc.jar
要求 登录名和密码为 sa,sa , 所有内容都在最后附件中(包含截图,数据库,源码,SQL jar) 可下载尝试
第一部分是图片和步骤说明,特地截图一步一步说明,第二部分是源码贴出,有几个简单的类都在staff包中.
先看第一部分:
1)目录说明:
D:\com 目录下存放我的源代码,这些源代码的包都是 package staff;从源码可以看到.

2)因为需要用到SQL SERVER2005的驱动,因此把sqljdbc.jar也放入 d:\com目录下,并点击右键解压缩(就如同解压.rar文件一样),就能看到有一个 sqljdbc的文件产生

3)sqljdbc文件夹中有一个com文件夹,把com文件夹剪切出来 放到源码区(即d:\com目录下)
说明sqljdbc文件下的com文件夹很显然就是com.microsoft.sqlserver.jdbc 的根目录,最底下 全是.class文件 .

4)在D:\com 目录源码区 再创建一个名称为 menifest的文件,注意不需要后缀

5)用编辑工具打开 menifest ,加入下面内容
- main- class : staff.MainMenu
main-class: staff.MainMenu
staff.MainMenu 表示staff包下的MainMenu类是含有main方法的程序启动类
注意: main-class: 冒号后空一格再写 staff.MainMenu
且 写完第一行后换行 第二行再空一行 让光标能落在第三行的位置,也就是说第一行后要空一行(至于为什么我也没有深究,有时效果没有出来,查了查就发现是这里的问题)

6)写好menifest文件后,就可以进入 cmd窗口 键入以下如图所示的内容,我会说明每一个步骤是做什么的,且将输出何种效果

7)cd /d d:\com 进入D盘com文件夹下的源码区
d:\com>javac -d d:/com *.java
(javac)编译 d:\com目录下 所有的.java源文件 -d d:/com 是指定编译后产生的.class 文件都输出到 d:/com 目录下
经过上面这个步骤,观察d:/com 目录就会发现 多了一个 staff文件夹,这是编译好后生成的 staff包文件夹,staff文件夹下就是每个源码对应生成的 .class文件了。


最后一个动作,其实就是将com目录..子目录下..目录下 和 staff目录下的.class文件打包成 .jar文件
jar cvmf menifest lvp.jar com/microsoft/sqlserver/jdbc/*.class staff/*.class
jar 是打包命令 menifest 就是刚才我们自己编写的一个文件 lvp.jar是要输出生成的jar包名称 ,com/microsoft/sqlserver/jdbc/*.class 空格 staff/*.class 是指要打包的.class文件
经过这一步就已经完成了最终的打包动作.
8)执行的看看

通过 java -jar lvp.jar 就可以执行了! 也不会出现因为 sqljdbc.jar找不到而引起的 com.microsoft.sqlserver.jdbc.SQLServerDriver 驱动类无法加载的异常了!
列出一部分测试源码
- package staff;
- import java.sql.Connection;
- import java.sql.DriverManager;
- import java.sql.ResultSet;
- import java.sql.SQLException;
- import java.sql.Statement;
- /**
- * 数据库操作对象管理类
- * --取得数据库连接对象
- * --关闭相关对象
- * @author Simon Lv
- */
- public class ConnectionManager {
- /** 数据库驱动类URL */
- private static final String URL= "com.microsoft.sqlserver.jdbc.SQLServerDriver" ;
- /** 数据源字符串 */
- private static final String BASE= "jdbc:sqlserver://localhost:1433;databasename=jspdemo" ;
- /** 用户名*/
- private static final String USER= "sa" ;
- /** 密码*/
- private static final String PWD= "sa" ;
- /**数据库连接对象*/
- private Connection connection;
- /**
- * 得到数据库连接对象
- * @return 数据库连接对象 Connection
- */
- public Connection getConnection(){
- try {
- //加载数据库驱动类
- Class.forName(URL);
- //得到数据库连接对象
- connection = DriverManager.getConnection(BASE,USER,PWD);
- } catch (ClassNotFoundException e) {
- e.printStackTrace();
- System.out.println( "数据库驱动类加载失败!请检查!" );
- } catch (SQLException e) {
- e.printStackTrace();
- System.out.println( "数据源配置有误!请检查!" );
- }
- //返回数据库连接对象
- return connection;
- }
- /**
- * 关闭所有数据操作对象
- * @param connection 数据库连接对象
- * @param pStatement SQL指令执行对象
- * @param rs 结果集对象
- */
- public void closeAllResource(Connection connection,Statement pStatement,ResultSet rs){
- try {
- //关闭RS 记录集
- if (rs!= null ) {
- rs.close();
- }
- //关闭SQL 执行执行对象
- if (pStatement!= null ) {
- pStatement.close();
- }
- //关闭数据库连接
- if (connection!= null && !connection.isClosed()) {
- connection.close();
- }
- } catch (SQLException e) {
- System.out.println( "关闭数据库操作对象时发生错误!请检查!" );
- }
- }
- }
package staff;
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.sql.Statement;
/**
* 数据库操作对象管理类
* --取得数据库连接对象
* --关闭相关对象
* @author Simon Lv
*/
public class ConnectionManager {
/** 数据库驱动类URL */
private static final String URL="com.microsoft.sqlserver.jdbc.SQLServerDriver";
/** 数据源字符串 */
private static final String BASE="jdbc:sqlserver://localhost:1433;databasename=jspdemo";
/** 用户名*/
private static final String USER="sa";
/** 密码*/
private static final String PWD="sa";
/**数据库连接对象*/
private Connection connection;
/**
* 得到数据库连接对象
* @return 数据库连接对象 Connection
*/
public Connection getConnection(){
try {
//加载数据库驱动类
Class.forName(URL);
//得到数据库连接对象
connection = DriverManager.getConnection(BASE,USER,PWD);
} catch (ClassNotFoundException e) {
e.printStackTrace();
System.out.println("数据库驱动类加载失败!请检查!");
} catch (SQLException e) {
e.printStackTrace();
System.out.println("数据源配置有误!请检查!");
}
//返回数据库连接对象
return connection;
}
/**
* 关闭所有数据操作对象
* @param connection 数据库连接对象
* @param pStatement SQL指令执行对象
* @param rs 结果集对象
*/
public void closeAllResource(Connection connection,Statement pStatement,ResultSet rs){
try {
//关闭RS 记录集
if (rs!=null) {
rs.close();
}
//关闭SQL 执行执行对象
if (pStatement!=null) {
pStatement.close();
}
//关闭数据库连接
if (connection!=null && !connection.isClosed()) {
connection.close();
}
} catch (SQLException e) {
System.out.println("关闭数据库操作对象时发生错误!请检查!");
}
}
}
- package staff;
- import java.sql.Connection;
- import java.sql.PreparedStatement;
- import java.sql.ResultSet;
- import java.util.ArrayList;
- /**
- * 数据访问操作对象 执行相应的增 删 改 查操作
- * @author Simon Lv
- *
- */
- public class DataAccessManager {
- /**数据库对象管理类对象*/
- ConnectionManager connManager = new ConnectionManager();
- /**数据库连接对象*/
- Connection connection;
- /**SQL执行对象*/
- PreparedStatement pStatement;
- /**结果集对象*/
- ResultSet rSet;
- /**员工实体类*/
- Staff staff;
- /**
- * 执行数据库的增 删 改 操作的方法 1
- * @param sql 增 删 改的SQL
- * @return 受影响的行数
- */
- public int executeSQL(String sql){
- int res= 0 ; //默认受影响的行数为0
- try {
- connection = connManager.getConnection(); //得到数据库连接
- pStatement = connection.prepareStatement(sql); //得到SQL操作对象
- res = pStatement.executeUpdate(); //执行返回受影响行数 的 增 删 改操作
- } catch (Exception e) {
- System.out.println( "执行数据库 增 删 改操作时发生错误!" );
- //程序调试阶段可使用 下面的方法
- System.out.println( "相应的SQL:" +sql);
- } finally {
- connManager.closeAllResource(connection, pStatement, rSet);
- }
- return res;
- }
- /**
- * 执行数据库的增 删 改 操作的方法 2
- * @param sql 增 删 改的SQL
- * @param param [] 参数
- * @return 受影响的行数
- */
- public int executeSQL(String sql,String param[]){
- int res= 0 ; //默认受影响的行数为0
- try {
- connection = connManager.getConnection(); //得到数据库连接
- pStatement = connection.prepareStatement(sql); //得到SQL操作对象
- if (param!= null ) {
- //循环放入相应的参数
- for ( int i = 0 ; i < param.length; i++) {
- pStatement.setString(i+ 1 , param[i]);
- }
- }
- res = pStatement.executeUpdate(); //执行返回受影响行数 的 增 删 改操作
- } catch (Exception e) {
- System.out.println( "执行数据库 增 删 改操作时发生错误!" );
- //程序调试阶段可使用 下面的方法
- System.out.println( "相应的SQL:" +sql);
- } finally {
- connManager.closeAllResource(connection, pStatement, rSet);
- }
- return res;
- }
- /**
- * 执行数据库的增 删 改 操作的方法 3
- * @param sql 增 删 改的SQL 数组
- * @param param [] 参数 数组
- * @return 受影响的行数 数组
- */
- public int executeSQL(String sql,String param[][]){
- int res= 0 ; //受影响的行数
- try {
- connection = connManager.getConnection(); //得到数据库连接
- pStatement = connection.prepareStatement(sql); //创建Statement对象
- if (param!= null ) {
- //循环加入要更新的SQL 语句 增 删 改 语句
- for ( int i = 0 ; i < param.length; i++) {
- //同时为这些SQL 语句 添加参数
- for ( int j = 0 ; j < param[i].length; j++) {
- pStatement.setString(j+ 1 , param[i][j]);
- }
- pStatement.addBatch(); //批量
- }
- }
- res = pStatement.executeBatch().length; //批量成功后所影响的行数
- } catch (Exception e) {
- e.printStackTrace();
- System.out.println( "执行数据库 增 删 改操作时发生错误!" );
- //程序调试阶段可使用 下面的方法
- System.out.println( "相应的SQL:" +sql);
- } finally {
- connManager.closeAllResource(connection, pStatement, rSet);
- }
- return res;
- }
- /**
- * 得到员工信息一条或多条
- * @param sql 查询语句
- * @param param 参数数组
- * @return 含有员工信息的集合
- */
- public ArrayList<Staff> getStaffInfo(String sql,String param[]){
- //创建Staff集合 将查询出来的内容放入这个集合中
- ArrayList<Staff> list = new ArrayList<Staff>();
- try {
- connection = connManager.getConnection(); //得到数据库连接
- pStatement = connection.prepareStatement(sql); //创建Statement对象
- if (param!= null ) {
- //循环放入相应的参数
- for ( int i = 0 ; i < param.length; i++) {
- pStatement.setString(i+ 1 , param[i]);
- }
- }
- //得到结果集
- rSet = pStatement.executeQuery();
- //循环遍历内容 并将内容放入实体类对象 并封装在集合中
- while (rSet.next()) {
- //每一行就是一条员工记录
- staff = new Staff();
- staff.setId(rSet.getInt( 1 )); //ID
- staff.setName(rSet.getString( 2 )); //名称
- staff.setSex(rSet.getString( 3 )); //性别
- staff.setAge(rSet.getInt( 4 )); //年龄
- staff.setRegTime(rSet.getString( 5 )); //录入时间
- //封装到集合中
- list.add(staff);
- }
- } catch (Exception e) {
- e.printStackTrace();
- System.out.println( "执行数据库 增 删 改操作时发生错误!" );
- //程序调试阶段可使用 下面的方法
- System.out.println( "相应的SQL:" +sql);
- } finally {
- connManager.closeAllResource(connection, pStatement, rSet);
- }
- return list;
- }
- }
package staff;
import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.util.ArrayList;
/**
* 数据访问操作对象 执行相应的增 删 改 查操作
* @author Simon Lv
*
*/
public class DataAccessManager {
/**数据库对象管理类对象*/
ConnectionManager connManager = new ConnectionManager();
/**数据库连接对象*/
Connection connection;
/**SQL执行对象*/
PreparedStatement pStatement;
/**结果集对象*/
ResultSet rSet;
/**员工实体类*/
Staff staff;
/**
* 执行数据库的增 删 改 操作的方法 1
* @param sql 增 删 改的SQL
* @return 受影响的行数
*/
public int executeSQL(String sql){
int res=0; //默认受影响的行数为0
try {
connection = connManager.getConnection(); //得到数据库连接
pStatement = connection.prepareStatement(sql); //得到SQL操作对象
res = pStatement.executeUpdate(); //执行返回受影响行数 的 增 删 改操作
} catch (Exception e) {
System.out.println("执行数据库 增 删 改操作时发生错误!");
//程序调试阶段可使用 下面的方法
System.out.println("相应的SQL:"+sql);
}finally{
connManager.closeAllResource(connection, pStatement, rSet);
}
return res;
}
/**
* 执行数据库的增 删 改 操作的方法 2
* @param sql 增 删 改的SQL
* @param param [] 参数
* @return 受影响的行数
*/
public int executeSQL(String sql,String param[]){
int res=0; //默认受影响的行数为0
try {
connection = connManager.getConnection(); //得到数据库连接
pStatement = connection.prepareStatement(sql); //得到SQL操作对象
if (param!=null) {
//循环放入相应的参数
for (int i = 0; i < param.length; i++) {
pStatement.setString(i+1, param[i]);
}
}
res = pStatement.executeUpdate(); //执行返回受影响行数 的 增 删 改操作
} catch (Exception e) {
System.out.println("执行数据库 增 删 改操作时发生错误!");
//程序调试阶段可使用 下面的方法
System.out.println("相应的SQL:"+sql);
}finally{
connManager.closeAllResource(connection, pStatement, rSet);
}
return res;
}
/**
* 执行数据库的增 删 改 操作的方法 3
* @param sql 增 删 改的SQL 数组
* @param param [] 参数 数组
* @return 受影响的行数 数组
*/
public int executeSQL(String sql,String param[][]){
int res=0; //受影响的行数
try {
connection = connManager.getConnection(); //得到数据库连接
pStatement = connection.prepareStatement(sql);//创建Statement对象
if (param!=null) {
//循环加入要更新的SQL 语句 增 删 改 语句
for (int i = 0; i < param.length; i++) {
//同时为这些SQL 语句 添加参数
for (int j = 0; j < param[i].length; j++) {
pStatement.setString(j+1, param[i][j]);
}
pStatement.addBatch();//批量
}
}
res = pStatement.executeBatch().length; //批量成功后所影响的行数
} catch (Exception e) {
e.printStackTrace();
System.out.println("执行数据库 增 删 改操作时发生错误!");
//程序调试阶段可使用 下面的方法
System.out.println("相应的SQL:"+sql);
}finally{
connManager.closeAllResource(connection, pStatement, rSet);
}
return res;
}
/**
* 得到员工信息一条或多条
* @param sql 查询语句
* @param param 参数数组
* @return 含有员工信息的集合
*/
public ArrayList<Staff> getStaffInfo(String sql,String param[]){
//创建Staff集合 将查询出来的内容放入这个集合中
ArrayList<Staff> list = new ArrayList<Staff>();
try {
connection = connManager.getConnection(); //得到数据库连接
pStatement = connection.prepareStatement(sql);//创建Statement对象
if (param!=null) {
//循环放入相应的参数
for (int i = 0; i < param.length; i++) {
pStatement.setString(i+1, param[i]);
}
}
//得到结果集
rSet = pStatement.executeQuery();
//循环遍历内容 并将内容放入实体类对象 并封装在集合中
while (rSet.next()) {
//每一行就是一条员工记录
staff = new Staff();
staff.setId(rSet.getInt(1));//ID
staff.setName(rSet.getString(2)); //名称
staff.setSex(rSet.getString(3)); //性别
staff.setAge(rSet.getInt(4)); //年龄
staff.setRegTime(rSet.getString(5)); //录入时间
//封装到集合中
list.add(staff);
}
} catch (Exception e) {
e.printStackTrace();
System.out.println("执行数据库 增 删 改操作时发生错误!");
//程序调试阶段可使用 下面的方法
System.out.println("相应的SQL:"+sql);
}finally{
connManager.closeAllResource(connection, pStatement, rSet);
}
return list;
}
}
这仅仅是一个示例 ,最方便的当然不需要我们自己动手去打包,但是也往往会碰到这样的问题,不需要去尝试太多的命令,也可以一步一步摸索出来。
文章虽然说的有点繁琐,但是还是记录下来吧,以后用的时候好找。
引用地址:http://lvp.iteye.com/blog/358635