最近的几个bug-maven

新入职工作还算轻松,接手了个做数据同步的工作,就是我们原本的表进行分库分表拆分后,运营后台花式查询的时候就会异常的麻烦,所以使用MQ来异步把拆分后的表再同步到大表里方便查询。主要是数据一致性问题,在多处地方做double check来保证数据一致,再配合监控异常日志记录并分类处理来保证最终数据一致性。
然后工作之余撸了个处女开源项目,一个简单的代码生成器,正好适合目前这种CRUD,减少重复作业.

前戏就这么些,那么接下来聊聊最近遇到的几个bug。

maven相关

关键词:

maven 本地jar依赖 assembly 打jar包,

错误:

can not find or load main class
找不到或无法加载主类

好了,完整的说一下吧
一切都要从那个万恶的ojdbc包说起,maven官方库居然没有这个oracle数据库的驱动包了,简直匪夷所思,难道是我的姿势有问题?没办法,只能野路子找了个加到本地lib目录,添加一下本地依赖了。

本地依赖打包

maven添加本地依赖很简单,pom.xml中加入:

1
2
3
4
5
6
7
<dependency>
<groupId>com.oracle</groupId>
<artifactId>ojdbc6</artifactId>
<version>11.2.0.1.0</version>
<scope>system</scope>
<systemPath>${basedir}/lib/ojdbc6-11.2.0.1.0.jar</systemPath>
</dependency>

${basedir}没有显示设置的话默认就是项目根目录。

package里面的话设置把依赖的包跟jar生成在同一目录下

1
2
3
4
5
6
7
<dependencySets>
<dependencySet>
<useProjectArtifact>false</useProjectArtifact>
<outputDirectory>lib</outputDirectory>
<unpack>false</unpack>
</dependencySet>
</dependencySets>

这段的作用是第三方依赖的包不进行解压,打进与jar同目录的lib目录

但执行mvn clean package命令的时候只会把非本地的包打入lib目录下,需要加上下面这段,来把本地依赖的包也打进去:

1
2
3
4
5
6
7
<dependencySet>
<scope>system</scope>
<includes>
<include>*:jar</include>
</includes>
<outputDirectory>lib</outputDirectory>
</dependencySet>

lib包是齐了,那引入路径呢,我们知道maven打成的jar包,classpath都是在jar/META-INF/MANIFEST.MF文件中的Class-Path项设置,那么在pom.xml里设置

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-jar-plugin</artifactId>
<version>2.4</version>
<configuration>
<archive>
<addMavenDescriptor>false</addMavenDescriptor>
<manifest>
<mainClass>com.lousama.generator.exec.Executor</mainClass>
<addClasspath>true</addClasspath>
<classpathPrefix>lib</classpathPrefix>
</manifest>
<!--<manifestFile>MANIFEST.MF</manifestFile>-->
<!-- 引入本地依赖jar到MANIFEST.MF的calss-path中-->
<manifestEntries>
<Class-Path>${basedir}/lib/ojdbc6-11.2.0.1.0.jar</Class-Path>
</manifestEntries>
</archive>
</configuration>
</plugin>
<plugin>

配置到此为止,OK一切正常,打出来的jar包真实,可靠。

但到了win上就阿西吧了!就出现了上述错误描述的问题。
乍看上去,很小儿科的问题嘛,没加载到主类。但搞了半天硬是没弄好,问题嘛,肯定是出在classpath上,后来发现本地的那个oracle驱动包打进去的时候是绝对路径。在OS X下没问题,但在win下面绝对路径就怎么也找不到主类了。
一开始把上述代码中<Class-Path>节点的${basedir}去掉,这样就可以打成相对路径,但打包的时候一直提示没找到该包。
阿西巴!打不起我,我还躲不起么我,干脆一不做二不休,不用你来生成MANIFEST了,我自己写好MANIFEST,然后打包的时候指定进去不就OK了。

最后在项目目录下添加自己写好的MANIFEST.MF,然后加入上面注释了的那段<manifestFile>MANIFEST.MF</manifestFile>

OK,终于大功告成,win下也能成功运行。

最新消息:不过后来又尝试了下去掉${basedir}/后好使了。。阿西巴!

mybatis相关

接下来说说第二个bug,是mybatis相关的。

因为我们同步数据是通过消息做异步处理的,业务应用是发送数据快照过来,算了 想了想要说的有点多,重新开一篇来写。