将Java Project (非web项目)打成Jar包并实现相关功能

本文介绍如何将Java项目打成Jar包,实现初始化线程池、定时任务和持续监听等功能,减少Spring框架依赖,提高性能和解耦。通过模拟案例演示Jar包的实现过程和使用方法。



  • 博客分类:

【若要转载,请标明出处,谢谢~~】


 

在实际项目中,很常见的是,会把一个web项目打成war包部署到tomcat或者weblogic服务器上来运行。但相对而言用的较少的是,把某一个java项目(非web项目)打成jar包作为一些

功能的进程,这种是比较巧妙和实用的做法。

 

比如本人最近接触到一个被打成jar包的java project(注意不是java web project),作为一个服务进程在服务器上运行。觉得很巧妙,故学习了下,记录下实现过程:

 

对于quartz定时任务, 本人之前的blog都有相关记录。其实久而久之,会认为quartz定时任务一定和Spring相关(包括我也是这样觉得),给人造成一种quartz必须要和Spring关联起来才能

玩下去的固有思维!其实,要保持清醒的头脑——Spring只是作为一个非常优秀的开源管理框架,他并不是quartz定时任务运行的必要条件!!

 

so,现在就抛开Spring框架。这也和本篇blog探讨的初衷契合——非web项目打成jar包,因为spring常常用于web项目中,而web项目包含很多spring框架依赖的jar包,显得比较臃肿!

 

我们接下来模拟一种比较实用和常见的情形,一个java project的作用是初始化线程池,运行定时任务和持续监听~~

伦理片 http://www.dotdy.com/

首先,我们模拟初始化线程池的操作:

一个死循环,你在启动的时候,必须放在启动顺序最后,否则的话,会由于死循环的“阻碍”,其他功能将直接启动不起来……

你可以先运行这个main方法来观察结果……

 

OK, 到这一步,这些类组成了一个java project。。那么我们就着手把它打成jar包了。

 

额,打成jar包也是有讲究的。注意不要打成普通的jar包。而是要选择打成runnable jar包,否则你会发现在dos下运行jar包会出现提示找不到相关类的异常,究其原因,是因为

你通过打成普通jar包的方式无法把工程里相关依赖的第三方jar包编译进去!具体做法是:

1)在程序的入口类(本例是ProcessorMain.java)中右键 Run As -> Run Configurations -> Java Application -> ProcessorMain(本例) 指定Project(要被打成jar

包的工程名)和Main class(入口类);

2)在项目上右键 Export -> Runnable JAR file -> 选择刚才第一步的Launch configuration: 入口类 - 工程名(很重要) ->选择导出的位置 -> 指定jar包名称 -> Next .. finish

第二步的目的即是为了较好的将依赖的第三方jar包也给整合进去!

 

Well done! 开始来见证奇迹的时刻!

打开dos环境(因为我是win7下测试的~),将目录切换到你保存的jar包的路径,然后运行命令:

java -jar processor.jar

运行一会儿,你会发现如下图所示结果:



 这说明,将一个普通的java project打成jar包,并实现相关功能的目的成功!

 

这次的东西让我感觉到,其实Spring只是作为一个优秀的管理框架而已,很多东西(比如本例说到的quartz定时任务的实现不一定非得依赖它才行~);作为jar包,相对war包而言,

少了很多spring的相关jar包,显得比较轻便; 类似本篇blog这种做法打成的jar包可以作为一个web工程的辅助,而不是把所有东西都给web工程来承担,在解耦和性能的角度上,

显得比较分明、科学和专业。

 

总之,感觉收获很多!!!

 


Java代码   收藏代码
  1. public class PoolManager {  
  2.       
  3.     public static void execute() {  
  4.         System.out.println("模拟初始化线程池操作..");  
  5.     }  
  6. }  

 接下来,模拟定时任务(注:相关jar包必须引入哦):

定时任务包括管理定时任务:

Java代码   收藏代码
  1. public class QuartzManager {  
  2.       
  3.     private static Logger log = Logger.getLogger(QuartzManager.class);  
  4.       
  5.     public static void scheduleJob(Job job,String time){  
  6.         //获取一个调度器  
  7.         Scheduler sched;  
  8.         try {  
  9.             sched = StdSchedulerFactory.getDefaultScheduler();  
  10.             //创建jobDetail实例,绑定Job实例(作业)  
  11.             JobDetail jobDetail = JobBuilder.newJob(job.getClass()).setJobData(new JobDataMap()).build();  
  12.             //创建触发器(指定在触发时间表达式触发)  
  13.             Trigger trigger = TriggerBuilder.newTrigger()  
  14.                     .withSchedule(CronScheduleBuilder.cronSchedule(time)).build();  
  15.             //调度器将任务类与触发器关联  
  16.             sched.scheduleJob(jobDetail,trigger);  
  17.             //启动调度  
  18.             if(!sched.isShutdown()){  
  19.                 sched.start();  
  20.             }  
  21.         } catch (SchedulerException e) {  
  22.             log.error(e);  
  23.         }  
  24.     }  
  25. }  

 (这种代码的方式启动定时任务我之前有篇blog探讨过,详见:http://raising.iteye.com/blog/2205561)

和模拟一个作业类:

Java代码   收藏代码
  1. public class QuartzJob1 implements Job{  
  2.   
  3.     @Override  
  4.     public void execute(JobExecutionContext ctx) throws JobExecutionException {  
  5.         SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd hh:mm:ss");  
  6.         String timeStap = sdf.format(new Date());  
  7.         System.out.println(timeStap + " 模拟定时任务开始执行");  
  8.     }  
  9.       
  10. }  

 最后,我们再模拟持续监听哈~

Java代码   收藏代码
  1. public class AlwaysManager {  
  2.       
  3.     public static void listener() {  
  4.         while(true) {  
  5.             System.out.println("模拟监听。。。。");  
  6.             try {  
  7.                 Thread.sleep(1000);  
  8.             } catch (InterruptedException e) {  
  9.                 e.printStackTrace();  
  10.             }  
  11.         }  
  12.     }  
  13. }  

 好了,几种常见的功能的实现都有了,接下来就写一个类负责调度噢:

Java代码   收藏代码
  1. public class ProcessorMain {  
  2.       
  3.     public static void main(String[] args) {  
  4.         //第一步:模拟开启初始化线程池  
  5.         initPool();  
  6.           
  7.         //第二步:模拟开启定时任务  
  8.         startQuartz();  
  9.           
  10.         //第三步:模拟开启需要一直执行的程序  
  11.         startListener();  
  12.     }  
  13.       
  14.     //定时任务  
  15.     public static void startQuartz() {  
  16.         QuartzManager.scheduleJob(new QuartzJob1(), "*/10 * * * * ? *");//每隔20s就定时执行一次  
  17.     }  
  18.       
  19.     //线程池  
  20.     public static void initPool() {  
  21.         PoolManager.execute();  
  22.     }  
  23.       
  24.     //监听程序  
  25.     public static void startListener() {  
  26.         AlwaysManager.listener();  
  27.     }  
  28. }  

 注意哦,在这里,由于持续化监听是一个死循环,你在启动的时候,必须放在启动顺序最后,否则的话,会由于死循环的“阻碍”,其他功能将直接启动不起来……

你可以先运行这个main方法来观察结果……

 

OK, 到这一步,这些类组成了一个java project。。那么我们就着手把它打成jar包了。

 

额,打成jar包也是有讲究的。注意不要打成普通的jar包。而是要选择打成runnable jar包,否则你会发现在dos下运行jar包会出现提示找不到相关类的异常,究其原因,是因为

你通过打成普通jar包的方式无法把工程里相关依赖的第三方jar包编译进去!具体做法是:

1)在程序的入口类(本例是ProcessorMain.java)中右键 Run As -> Run Configurations -> Java Application -> ProcessorMain(本例) 指定Project(要被打成jar

包的工程名)和Main class(入口类);

2)在项目上右键 Export -> Runnable JAR file -> 选择刚才第一步的Launch configuration: 入口类 - 工程名(很重要) ->选择导出的位置 -> 指定jar包名称 -> Next .. finish

第二步的目的即是为了较好的将依赖的第三方jar包也给整合进去!

 

Well done! 开始来见证奇迹的时刻!

打开dos环境(因为我是win7下测试的~),将目录切换到你保存的jar包的路径,然后运行命令:

java -jar processor.jar

运行一会儿,你会发现如下图所示结果:



 这说明,将一个普通的java project打成jar包,并实现相关功能的目的成功!

影音先锋电影 http://www.iskdy.com/ 

这次的东西让我感觉到,其实Spring只是作为一个优秀的管理框架而已,很多东西(比如本例说到的quartz定时任务的实现不一定非得依赖它才行~);作为jar包,相对war包而言,

少了很多spring的相关jar包,显得比较轻便; 类似本篇blog这种做法打成的jar包可以作为一个web工程的辅助,而不是把所有东西都给web工程来承担,在解耦和性能的角度上,

显得比较分明、科学和专业。

 

总之,感觉收获很多!!!

 

评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值