使用过maven的开发者都会对Maven爱不释手,但是往往我们有一些旧的项目不是Maven管理的;当我们需要把普通项目转为Maven项目时,我们需要一个个把jar包转为依赖;这是非常单调、费时的,所以就写了一个普通项目转Maven项目的工具。
工具特性
- 根据jar的sha1值从配置的maven仓库查找依赖,自动生成Dependencies
- 支持多java源码项目,配置java源码目录后会自动生成Maven项目的目录
- 依赖查找支持本地字典缓存,查找到依赖后自动存入字典文件,节省下次转换时间
- 转换完成自动构建,确认项目项目是否转换正常
主要原理
如果我们平时使用nexus搭建的maven私服的话,可能会注意到有这么一个查询:
这个使用jar的校验码进行检索,校验码可以使sha1,也可以是md5,那么我们要是想根据jar文件找到对应的Maven依赖写法,可以使用这个查询接口,比如下面这个链接:
如果是浏览器打开我们会看到一个xml,仔细查看不难发现其中的dependency需要的元素。
关键代码
配置文件
<?xml version="1.0" encoding="UTF-8"?> <com.whaty.util.convertMaven.bean.Config> <!-- 源项目配置 --> <sourceProject> <!-- 源项目根路径 --> <basePath>F:\workspace\sourceProject</basePath> <!-- 源项目webRoot目录 --> <webRoot>WebContent</webRoot> <!-- 源项目java文件,多源码目录配置多个即可 --> <javaDirs> <string>src</string> <string>sns</string> </javaDirs> <!-- 源项目配置文件目录 --> <resDirs> <string>src</string> <string>sns</string> </resDirs> </sourceProject> <!-- 目标项目配置 --> <descProject> <!-- 目标项目根路径,新项目输出路径 --> <basePath>F:\workspace\descProject</basePath> <groupId>com.whaty</groupId> <artifactId>ccTestM001</artifactId> </descProject> <!-- 检索jar包的url地址,可配置多个 --> <searchJarUrls> <string><![CDATA[http://192.168.20.31/nexus/service/local/lucene/search?_dc=1443060145021&sha1=]]></string> <string><![CDATA[http://maven.oschina.net/service/local/lucene/search?_dc=1443060145021&sha1=]]></string> </searchJarUrls> <!-- 是否根据jar包名称检索 --> <searchByName>false</searchByName> </com.whaty.util.convertMaven.bean.Config>
说明:
- javaDirs:java源码目录,如果是src,它在新项目中的目录默认是/src/main/java/;其他目录比如sns在新项目中的目录是/src/sns/java/
- resDirs:配置文件目录,src目录在新项目中的目录会默认是/src/main/resources/;其他目录比如sns在新项目中的目录是/src/sns/resources/
- searchJarsUrls:值是ture/false,如果为true当根据sha1值查找不到时,会根据jar名称模糊查找,目前根据名称查找的方式比较不准确,建议设置为false
根据jar包查找依赖:先在字典中查找,如果找不到就使用sha1在所有配置的私服中查找。代码如下:
public String getDependenciesXml(List<File> jars) { log.info("开始 依赖查找"); StringBuffer xml = new StringBuffer(); for (File jar : jars) { try { String sha1 = Sha1Util.getFileSha1(jar); // 根据sha1在字典中查找 String dependencyXml = this.getDependencyByDict(sha1); // 根据sha1联网查找 if (StringUtils.isBlank(dependencyXml)) { dependencyXml = this.getDependencyByNexus(sha1); } // 根据artifactId和version联网查找 if (StringUtils.isBlank(dependencyXml)) { dependencyXml = this.getDependencyByArtifact(jar); } if (StringUtils.isBlank(dependencyXml)) { this.unFoundJars.add(jar.getName()); log.error("添加依赖 " + String.format("%-50s", jar.getName()) + " 失败."); this.failJars++; } else { xml.append(dependencyXml); log.info("添加依赖 " + String.format("%-50s", jar.getName()) + " 成功."); this.sucJars++; } } catch (Exception e) { this.unFoundJars.add(jar.getName()); log.error("添加依赖 " + String.format("%-50s", jar.getName()) + " 失败."); this.failJars++; } } // 记录未检测到的jar文件 if (this.unFoundJars.size() > 0) { try { this.unFoundJarLogFile.createNewFile(); FileUtils.writeLines(this.unFoundJarLogFile, this.unFoundJars); } catch (IOException e) { log.error("未检测到的jar写入文件失败"); } } log.info("完成 依赖查找"); return xml.toString(); }
注意:在pom模板中配置的repositories范围应该不小于在config.xml中配置的检索仓库的范围,否则构建项目时会找不到依赖。
- 海报