一个一年前的项目,最近发现了一个问题,在生产环境上,不能发邮件。一看才发现原来 是缺少 jar 包。那导个 jar 包就好了,对吧。
但是在我打包项目的时候。发现,居然 myeclipse 不能导出 jar 包。那些引用的 myeclipse 自带的 jar 包全部不能导出。坑啊。
so,多少个日日夜夜想着的事情,现在就做。搭建一个私服 maven 仓库,把这个项目转成 maven 的。
搭建 maven 私服( 使用 Nexus )
http://blog.csdn.net/zhanlanmg/article/details/45600813
maven 和 nexus 的安装这里不再详述。
过程是这样子的:
.
1. 创建一个 java web 项目 ,启动 maven 支持(eclipse 安装 maven 插件后创建时有选项,插件自己装)。
.
2. 在搭建自己的 maven 仓库 (这个很简单,看教程就好了,另外 注意 一定要 开启 索引服务,这样方便下一步查找需要的 jar 包的 pom 引用)
.
3. 第 2 步要下载的文件,大约有 1.5 GB。等待是一个很漫长的过程,可以做点别的事情。下载完成后,在 nexus 里面搜索就能看到想要的 jar 包的信息。按旧项目中使用的 jar 包,查找,并加入到 pom.xml 中。
.
4. 修改用户名下 .m2 文件夹中的 settings.xml 文件,设置 maven 从本地 nexus 下载 jar 包。
在 settings.xml 中找到 mirrors 在里面添加如下内容 其中 mirrorOf * 代表所有请求都去这个仓库(暂时不需要复杂的配置)
<mirror>
<id>my.nexus</id>
<mirrorOf>*</mirrorOf>
<name>my.nexus</name>
<url>http://localhost:8081/nexus/content/groups/public/</url>
</mirror>
.
5. maven 编译项目, mvn clean install 就足够了,在 eclipse 中右击项目 run –> maven Builder 输入 clean install 即可。这个时候会去仓库下载 jar 包,而本地仓库现在没有,会去代理仓库(中央仓库)下载,这可能会是一个非常慢的过程,受网速等限制(注:下载很慢,失败的时候会报错,再开始一次,一次,一次,直到全部下载完成,这也是需要 maven 私服的原因)。
这里有几个公共仓库,供参考。
maven公共仓库
http://blog.csdn.net/zhanlanmg/article/details/45600835
.
6. 第 5 步编译没有问题后,就把所有旧项目中的 java 源码,都放到 maven 工程的源码目录(这个是自己设置的,在项目 –> 属性 –> java builder path –> Source ),再把原来的 webroot 下的所有文件都放在 maven 项目的 src –> main –> webapp 下(这是 maven 的项目结构)。
.
7. 同第 5 步,现在编译完整项目,我有遇到一个问题
ImageUtils.java:[1,0] 错误: 非法字符: \65279
这个只会在项目源码是 utf-8 时出现,因为前面出现了 BOM 标记,所以会出现这个问题,需要用其它编辑器把这个东西去掉。或者用 maven 编译完 资源文件后,再用 project –> build 编译 java 代码 也是可以的。
.
8. 在第 2 步选择 jar 包的时候一定要注意 jar 包的版本,因为不同的版本可能会出现各种问题,最好是按照原项目的版本选择。比如 我原项目 是 hibernate-core 3.3.0, 而我在新项目中使用了 3.5.6(不要为了用高版本而用高版本), 就出现了 Caused by: java.lang.NoSuchFieldError: ALIAS_TO_ENTITY_MAP 换回 3.3.0 就没有问题。
.
9. jar 包冲突问题。
遇到这样的现象,发邮件时 出现 java.lang.UnsupportedOperationException: Method not yet implemente
这个是由于 jar 包 mail-1.5.0-b01.jar 和 geronimo-spec-javamail-1.3.1-rc3.jar 冲突,而 mail-1.5.0-b01.jar 是我需要的,geronimo-spec-javamail-1.3.1-rc3.jar 是我不需要的。
解决:在项目中运行 mvn dependency:tree ,可以看到 maven 生成的依赖树。如下片段:
[INFO] +- com.cloudhopper.proxool:proxool:jar:0.9.1:compile
[INFO] | \- avalon-framework:avalon-framework-api:jar:4.3:compile
[INFO] | \- avalon-logkit:avalon-logkit:jar:2.1:compile
[INFO] | +- geronimo-spec:geronimo-spec-javamail:jar:1.3.1-rc3:compile
[INFO] | \- geronimo-spec:geronimo-spec-jms:jar:1.1-rc4:compile
这个 jar 包是由于我使用了一个数据库连接池而引入的。
不需要它们两个,需要在 pom.xml 中引入 proxool 的引用中加上 excluded 标签,如下:
<dependency>
<groupId>com.cloudhopper.proxool</groupId>
<artifactId>proxool</artifactId>
<version>0.9.1</version>
<!-- 这个就是我们要排除依赖包,解决jar包冲突 -->
<exclusions>
<exclusion>
<groupId>geronimo-spec</groupId>
<artifactId>geronimo-spec-javamail</artifactId>
</exclusion>
<exclusion>
<groupId>geronimo-spec</groupId>
<artifactId>geronimo-spec-jms</artifactId>
</exclusion>
</exclusions>
</dependency>
这样即可解决冲突。
以上是遇到的一些问题,希望能够解决一些人的一些问题。