`

简单jar打包示例 合并第三方jar包打包操作

阅读更多
涉及到的编译和打包问题
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 


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.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;
	}
}



这仅仅是一个示例 ,最方便的当然不需要我们自己动手去打包,但是也往往会碰到这样的问题,不需要去尝试太多的命令,也可以一步一步摸索出来。
3
1
分享到:
评论
1 楼 invalid 2012-04-10  
到底是应该给生成menifest还是manifest,看上面截图,命令行是menifest,程序输出又是manifest?

相关推荐

    aar包合并打包;module引用第三方aar包;library依赖aar包

    本示例主要解决module中引用aar包依赖报错的问题,及aar包合并打成新aar包的问题。aar合并打包报错解决方案,library、module集成aar包报Execution failed for task ':app:mergeDebugNativeLibs、Could not resolve ...

    fat-Jar打包插件

    【fat-Jar打包插件】是一种在Java开发中常用的工具,它的主要作用是将一个项目的所有依赖库(包括第三方jar包)与源代码一起打包成一个独立的jar文件,因此被称为"fat"或"uber"jar。这个插件极大地简化了项目的部署...

    java应用程序打包工具--fat jar

    这种转换通常通过第三方工具,如JSmooth、Launch4j或Excelsior JET等实现。它们允许Java应用以更符合本地操作系统用户习惯的方式运行,例如提供图标、命令行参数支持以及更好的错误报告。 JavaLauncher在压缩包子...

    java打包技巧.rar

    确保所有的第三方库都有正确的许可,并且在打包时遵循相应的规则。此外,使用模块化系统,如Java 9及更高版本的模块系统(Jigsaw),可以帮助更好地组织和打包代码,减少依赖冲突。 总的来说,Java打包技巧涵盖了...

    android打包zip

    要将文件打包成ZIP,我们需要使用Java的内置库或第三方库。Java的标准库提供了一个名为`java.util.zip`的包,其中包括了`ZipOutputStream`和`ZipEntry`等类,可以用来创建和写入ZIP文件。以下是一个简单的示例,展示...

    fatjar_0.0.32

    本文将详细介绍“fatjar_0.0.32”,这是一个专门用于将第三方jar包打包进jar中的工具,它的出现大大简化了开发者的操作流程。 fatjar是一个开源项目,其目标是解决Java程序的依赖问题,特别是对于那些需要作为独立...

    将Java代码打包为exe文件(绝对可行)

    除了手动编写本地代码之外,还可以使用一些第三方工具来自动化整个过程,比如: - **Launch4j**:一款开源工具,可以将Java应用程序打包成独立的exe文件。 - **Exe4j**:JetBrains公司提供的工具,支持多种类型的...

    Maven仓库理解、如何引入本地包、Maven多种方式打可执行jar包

    2. **远程仓库**:远程仓库可以是组织内部的私有仓库,也可以是公开的第三方仓库。例如,JFrog Artifactory、Nexus等。远程仓库用于存储公司内部组件或不常使用的第三方库,以减轻对中央仓库的依赖。 3. **中央仓库...

    Spire.Doc生成docx的第三方包

    `Spire.Doc`是一个强大的第三方库,专为.NET和Java开发者设计,用于创建、编辑和转换Microsoft Word(.docx)文档。这个库以其易用性和丰富的功能,简化了程序中处理Word文档的工作。 **1. Spire.Doc的基本介绍** ...

    aspose-words-14.9.0-jdk16.rar

    Aspose.Words是一个广受欢迎的第三方库,它提供了丰富的API,支持多种文档操作,如创建、编辑、格式化、合并、分割文档,以及导出到各种不同的格式,如PDF、HTML、图片等。在这个版本14.9.0中,开发者可以利用其强大...

    Spire.Doc for Java 11.4.2 全功能无限制

    这有助于避免潜在的类路径冲突,尤其是在使用多个第三方库时。 **使用示例和测试:** 官方提供的例子已经过测试并确认工作正常。这意味着开发人员可以参照这些示例快速了解如何在自己的项目中集成和使用Spire.Doc ...

    ejb3.0非常实用教程

    - 将第三方库添加到项目的`lib`目录。 - 在`pom.xml`中配置依赖。 5. **J2EE项目打包** - 对于包含EJB和Web组件的项目,使用`build.xml`进行构建。 - 配置`web.xml`和`ejb-jar.xml`以确保正确部署。 6. **恢复...

    华为短信开发包(Java)

    SMPP允许第三方应用直接与短信网关进行交互,实现短信的发送和接收。在Java中,实现SMPP协议通常涉及SmppSession的管理、PDU的处理和长短信的拆分与合并。 6. **smproxy.jar**: 这个标签很可能指的是华为提供的一个...

    EJB3.0中文资料

    - 将第三方类库加入到JAR文件的`/WEB-INF/lib`目录下。 - 或者直接将这些类库包含在EJB项目的类路径中。 ##### 3.7 共用了第三方类库的J2EE应用如何打包 - 类似于EJB打包方式,将第三方类库放置在适当的目录下。 -...

    Unity 接入讯飞语音识别包(Android)

    在Unity游戏开发中,接入第三方服务,如讯飞语音识别,可以极大地提升用户体验,特别是对于移动平台的游戏。本文将详细讲解如何在Unity中整合讯飞的语音识别功能,并且着重于Android平台的实现。 首先,我们需要...

    apache-cxf-3.1.18.zip

    6. **依赖库**:CXF可能依赖于其他第三方库,如JAXB(Java Architecture for XML Binding)、StAX(Streaming API for XML)等,这些依赖库也会包含在压缩包中。 使用Apache CXF的主要优点包括: - **易于使用**:...

    Jboss EJB3.0 实例教程.pdf

    - **处理第三方类库**:当EJB或Web应用依赖于第三方库时,需要将这些库包含在相应的部署包中。 - **开发环境恢复**:提供步骤以帮助读者快速搭建与教程配套的开发环境。 - **调试技巧**:教授如何使用调试工具来...

    Laravel开发-laravel-frontend-assets

    10. **第三方库的引入**:开发者可以通过`package.json`管理前端依赖,如jQuery、Bootstrap或其他UI库,然后在Mix配置中引入并处理。 11. **Blade组件与Vue组件的结合**:Blade组件可以在视图层与Vue组件协同工作,...

    ant和yuicompressor 压缩css、js方案

    在处理CSS和JS压缩时,我们可能需要引入Ant的外部任务,比如使用Apache Ant的贡献任务或第三方插件,如Compress Task,来调用YUI Compressor。 接下来,让我们详细探讨YUI Compressor的功能和用法。YUI Compressor...

Global site tag (gtag.js) - Google Analytics