来到新单位才4天,跟原来的国企就是不同,各类开发都要求快速健壮,写完需求都要跑测试用例,虽然比在国企累多了,可是天天都能学到新东西,反正年轻,不用图找个轻松的工做。java
刚来就有个小需求,写个定时任务,天天读取一个文件,里面是新浪微博用户的uid,把这些uid存到数据库。还有个定时任务是从数据库中取出uid,根据uid检查用户发出的第一条微博内容的mid,给这条微博作回复。mysql
需求很明了,一条路就顺下来,没什么很可贵,可是实际操做就赶上不少问题。android
首先没有依托的项目,须要本身新建,这样不少功能的好比数据库映射层还要从新写,比较麻烦。新建项目前先了解下功能,首先读取文件确定没问题,存到数据库也不难,先研究获取用户mid和给微博评论功能。web
先看了看微博的api::open.weibo.com。找到对应的api接口spring
由于是到新单位,稍微有点着急,想赶忙弄出来,因为我本身申请过一个新浪微博开发者帐号,有token,因此这2个须要的功能大概看了看就开始用httpclient写对应的功能,后来问了下同事才知道有现成的weibo4j的包文件,直接调用里面对应功能行。并且也不用token,使用cookies就行sql
Timeline tm = new Timeline();
JSONObject status = null;
status = tm.getUserTimelineIdsByUid(uid);
JSONArray statuses = null;
statuses = (JSONArray) status.get("statuses");
mid = statuses.get(0).toString();数据库
Comments cm = new Comments();
cm.client.setCookie(cookie);apache
第一天就光跟这个微博的接口较劲了,其实若是早点问问同事,没准很快就能出来后端
后面就是写关于数据库映射层的相关功能,以前我一直使用ibatis,这边的项目用的jdbcTemplate,原本为了项目的统一,我说我也用jdbcTemplate吧,各类问题啊,可能也是因为我着急的关系,弄了一下午也没出来,主要问题就是log日志和我这边的spring包有冲突,最后仍是用回去ibatis,10几分钟就搞定了,固然就是个简单使用,没有进行过封装api
<bean id="dataSource" class="org.apache.commons.dbcp.BasicDataSource" destroy-method="close"> <property name="driverClassName" value="com.mysql.jdbc.Driver"/> <property name="url" value="xxxx"/> <property name="username" value="xxx"/> <property name="password" value="xxx"/> <property name="initialSize" value="5"/> <property name="maxActive" value="10"/> <property name="maxIdle" value="10"/> <property name="minIdle" value="20"/> </bean> <bean id="sqlSessionFactory" class="org.mybatis.spring.SqlSessionFactoryBean"> <property name="dataSource" ref="dataSource"/> <!-- 指定sqlMapConfig总配置文件,订制的environment在spring容器中不在生效--> <!--<property name="configLocation" value="classpath:sqlMapConfig.xml"/>--> <!--指定实体类映射文件,能够指定同时指定某一包以及子包下面的全部配置文件,mapperLocations和configLocation有一个便可,当须要为实体类指定别名时,可指定configLocation属性,再在mybatis总配置文件中采用mapper引入实体类映射文件 --> <property name="mapperLocations" value="classpath*:MybatisMapper/*.xml"/> </bean> <bean id="sqlSession" class="org.mybatis.spring.SqlSessionTemplate"> <constructor-arg index="0" ref="sqlSessionFactory"/> </bean> <bean id="weiboTaskDao" class="com.wrm.task.dao.impl.WeiboTaskDaoImpl"> <!--注入SqlSessionTemplate实例 --> <property name="sqlSession" ref="sqlSession"/> <!--也可直接注入SqlSessionFactory实例,两者都指定时,SqlSessionFactory失效 --> <!-- <property name="sqlSessionFactory" ref="sqlSessionFactory" /> --> </bean>
public class WeiboTaskDaoImpl implements WeiboTaskDao { public SqlSessionTemplate sqlSession; // 相关接口 public void setSqlSession(SqlSessionTemplate sqlSession) { this.sqlSession = sqlSession; } }
用ibatis写了几个接口,批量插入,读取list,更新,每次给用户发的微博回复成功后会回写数据库标记下
次日就这么过去了,数据库映射应该使用我最经常使用的,反正也是新项目,结果非要是用jdbcTemplate,耽误时间
大概功能已经完事了,后面还有不少收尾的功能,好比加上警报功能,若是出现严重错误须要发邮件,添加错误日志等信息,而后就是打包运行。。。。
打包运行又是一个比较麻烦的地方,以前一直都是写的web后端,没有用过这种java se的项目,打成jar包运行也没太了解,这边的项目有用ant脚本作发布的,看了一阵没太看明白,并且那个项目没有用spring,配置文件不多,我这边不行啊,spring 的配置文件和ibatis的sql映射文件都不少啊,试了试ant也没弄好,一上午又过去了
这咋整,想了想我这边的项目使用的maven作管理,maven应该整合了ant功能,上网搜了搜maven打jar包,有点心得
原文地址http://blog.csdn.net/c_4818/article/details/6700950
这里使用一个maven插件maven-shade-plugin 指定了main.class后就能打成jar包了,注意:这里打包后,你在项目中引入的jar包如spring等,会把这些jar包解压成class文件再统一打到你的项目里,运行jar的时候就不用再关心外部jar包的问题了
可是这里我仍是出现了一个很郁闷的问题,由于weibo4j作过修改,并无传到私服里,致使我在项目里只能这么调用
<dependency> <groupId>com.loopj.xxx</groupId> <artifactId>xxx-async-http</artifactId> <version>1.3.2</version> <type>jar</type> <scope>system</scope> <systemPath>${project.basedir}/libs/xxx-async-http-1.3.2.jar</systemPath> </dependency>
这么作的结果就是打包的时候找不到这个jar文件,报错:
[WARNING] Some problems were encountered while building the effective model for **apk:1.0 [WARNING] 'dependencies.dependency.systemPath' for xxx.http:xxx-async-http:jar should not point at files within the project directory, ${project.basedir}/libs/android-async-http-1.3.2.jar will be unresolvable by dependent projects @ line 36, column 2
最主要的就是这个报错信息
jar should not point at files within the project directory
给出了很好的答案,大概说下就是使用mvn install:install-file 把引入的外部jar导入到本地maven仓库中,再使用package就能打到一块儿了
发布第三方Jar到本地库中:
mvn install:install-file -DgroupId=com -DartifactId=client -Dversion=0.1.0 -Dpackaging=jar -Dfile=d:\client-0.1.0.jar
总算了打成jar包了,该能运行了吧,结果仍是错误,一个以前没有重视的问题,参看别的项目,关于Properties的配置是使用这样的方式
String dir = System.getProperty("user.dir"); System.setProperty("log.root",dir+"/log"); System.setProperty("conf.path",dir+"/conf");
打成jar包运行的话就很是麻烦不论是spring的配置文件application仍是properties文件都不能打到jar包里,而是在jar包同级目录生成conf目录,都放在了这里,可是我这边不行啊,因此还得改,最好是把这些配置文件都在jar文件中访问
原来这些Properties配置文件就不用String filePath的方式读取了,都使用URI的方式,这样就算这些配置打到了jar包里也能正确访问
public static void init() throws IOException, URISyntaxException { PropertyConfigurator.configure(ClassLoader.getSystemResource("log4j.properties")); properties.load(ClassLoader.getSystemResourceAsStream("config.properties")); }
既然都是使用的maven作管理,这些config.properties都是放在resources目录下的
这里再记录下resource的用法,就是把一些配置文件打到jar包里
<resources> <resource> <targetPath>conf/</targetPath> <filtering>false</filtering> <directory>${basedir}/conf</directory> <includes> <include>**/*</include> </includes> </resource> </resources>
ibatis的配置刚才也给看了<property name="mapperLocations" value="classpath*:MybatisMapper/*.xml"/>
而后就能运行了,真是不容易,这是打出来的jar包
像什么net,org都是项目里引用的jar包,都给你解压成class了放进来了