Maven篇----07 如何将普通java项目转换为maven项目
本文使用idea,Eclipse也类似
一、引言
0. 为何要使用maven?
公司项目目前遇到的问题:
-
版本管理混乱
版本多的时候,出现问题难以定位,为问题的排查和解决增加了很大的难度 -
项目过于复杂, 层次结构不够清晰,显得很臃肿,
不利于新同事理解业务 -
拉取项目代码时,文件很大下载慢
在下载代码的同时,要拉取几百兆的依赖包 -
容易出现jar包冲突或者是缺少相应的依赖jar包
随着需要的jar包越来越多, 每次引入jar包也需要小心翼翼, 说不准什么时候就会造成jar包冲突,
而且也很容易造成某个jar包依赖的jar包没有引入而导致整个项目跑不起来
基于以上, 我们引入了maven
二、将普通java项目转换为maven项目
1. 导入项目并新建pom.xml文件
鼠标右键: File -> open -> 选择项目路径;在项目的根目录下创建pom.xml文件:
<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
<modelVersion>4.0.0</modelVersion>
<groupId>com.isoftstone.core</groupId>
<artifactId>isc</artifactId>
<packaging>war</packaging>
<version>1.0.0-SNAPSHOT</version>
<name>isc_env_dev</name>
<dependencies>
</dependencies>
<build>
<finalName>isc</finalName>
<plugins>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-compiler-plugin</artifactId>
<version>3.1</version>
<configuration>
<source>1.8</source>
<target>1.8</target>
<encoding>UTF-8</encoding>
</configuration>
</plugin>
</plugins>
</build>
</project>
2. 按照maven项目目录格式创建目录结构
这里有以下两个关键目录:
a1. Java类文件标准目录: src/main/java
a2. 资源文件(配置)标准目录: src/main/resources
a3. js文件我的目录: src/main/webapp(注意:最终要保证编译打包好的文件结构与原始项目编译打包后的文件结构一致)
注意:目录需要标记为对应的目录结构(选中目录右键 Mark Directory as -> Sources Root (或Resources Root))
3. 生成maven项目依赖,并导入依赖
可以手动添加,但是我们的项目动辄上百个依赖包。
这里推介用大佬写好的依赖生成的工具类实现,该工具类需要用到下面的一些工具类,因此,请先将下面的依赖项复制到pom.xml文件中。
<dependency>
<groupId>org.dom4j</groupId>
<artifactId>dom4j</artifactId>
<version>2.1.0</version>
</dependency>
<dependency>
<groupId>com.alibaba</groupId>
<artifactId>fastjson</artifactId>
<version>1.2.47</version>
</dependency>
<dependency>
<groupId>org.jsoup</groupId>
<artifactId>jsoup</artifactId>
<version>1.8.3</version>
</dependency>
依赖生成工具类代码如下,源地址请移步,使用方法是直接将该工具类添加到项目中,其中“lib”是您的jar文件的存放目录的路径:
import java.io.File;
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.IOException;
import java.util.jar.JarInputStream;
import java.util.jar.Manifest;
import org.dom4j.Element;
import org.dom4j.dom.DOMElement;
import org.jsoup.Jsoup;
import org.jsoup.nodes.Document;
import com.alibaba.fastjson.JSONObject;
public class MakePomFromJars {
public static void main(String[] args) throws FileNotFoundException, IOException {
Element dependencys = new DOMElement("dependencies");
File dir = new File("lib");
for (File jar : dir.listFiles()) {
JarInputStream jis = new JarInputStream(new FileInputStream(jar));
Manifest mainmanifest = jis.getManifest();
jis.close();
if (mainmanifest == null) {
System.err.println(jar.getName());
continue;
}
String bundleName = mainmanifest.getMainAttributes().getValue("Bundle-Name");
String bundleVersion = mainmanifest.getMainAttributes().getValue("Bundle-Version");
Element ele = null;
StringBuffer sb = new StringBuffer(jar.getName());
if (bundleName != null) {
bundleName = bundleName.toLowerCase().replace(" ", "-");
sb.append(bundleName + "\t").append(bundleVersion);
ele = getDependices(bundleName, bundleVersion);
// System.out.println(sb.toString());
// System.out.println(ele.asXML());
}
if (ele == null || ele.elements().size() == 0) {
bundleName = "";
bundleVersion = "";
String[] ns = jar.getName().replace(".jar", "").split("-");
for (String s : ns) {
if (Character.isDigit(s.charAt(0))) {
bundleVersion += s + "-";
} else {
bundleName += s + "-";
}
}
if (bundleVersion.endsWith("-")) {
bundleVersion = bundleVersion.substring(0, bundleVersion.length() - 1);
}
if (bundleName.endsWith("-")) {
bundleName = bundleName.substring(0, bundleName.length() - 1);
}
ele = getDependices(bundleName, bundleVersion);
sb.setLength(0);
sb.append(bundleName + "\t").append(bundleVersion);
// System.out.println(sb.toString());
// System.out.println(ele.asXML());
}
ele = getDependices(bundleName, bundleVersion);
if (ele.elements().size() == 0) {
ele.add(new DOMElement("groupId").addText("not find"));
ele.add(new DOMElement("artifactId").addText(bundleName));
ele.add(new DOMElement("version").addText(bundleVersion));
System.out.println(
sb.toString() + " not find, please visit https://mvnrepository.com/ to get more info.");
}
dependencys.add(ele);
// System.out.println();
}
System.out.println(dependencys.asXML());
}
public static Element getDependices(String key, String ver) {
Element dependency = new DOMElement("dependency");
// 设置代理
// System.setProperty("http.proxyHost", "127.0.0.1");
// System.setProperty("http.proxyPort", "8090");
try {
String url = "http://search.maven.org/solrsearch/select?q=a%3A%22" + key + "%22%20AND%20v%3A%22" + ver
+ "%22&rows=3&wt=json";
Document doc = Jsoup.connect(url).ignoreContentType(true).timeout(30000).get();
String elem = doc.body().text();
JSONObject response = JSONObject.parseObject(elem).getJSONObject("response");
if (response.containsKey("docs") && response.getJSONArray("docs").size() > 0) {
JSONObject docJson = response.getJSONArray("docs").getJSONObject(0);
Element groupId = new DOMElement("groupId");
Element artifactId = new DOMElement("artifactId");
Element version = new DOMElement("version");
groupId.addText(docJson.getString("g"));
artifactId.addText(docJson.getString("a"));
version.addText(docJson.getString("v"));
dependency.add(groupId);
dependency.add(artifactId);
dependency.add(version);
}
} catch (Exception e) {
e.printStackTrace();
}
return dependency;
}
}
运行结果:
使用时,只需要将运行结果字符串复制到pom.xml文件中。
注意:
项目依赖jar一般有三类,一类是公共jar,maven官网可以查到;第二类是公司自己的jar,第三类是第三方jar
a1. 当遇到not find,且是公共jar时,可以自己到maven官网上核实。
a2. 当遇到not find且不是公共jar,或者红色不识别的,就是自有的一些jar。如果公司有搭建私服的需要把这些jar管理起来;否则可作为外部jar在pom中引入
4. 对项目进行编译打包
- 项目上右键 Add Framework Support,选择maven,点击OK。在项目右侧显示MAVEN窗口
- 接下来执行mvn clean install 对项目进行编译
5. 删除多余的目录
打包编译成功之后,就可以把不必要的目录干掉了! 主要是bin目录和lib目录
三、可能遇到的问题
1. 编译打包都成功,项目运行起来当操作涉及到数据库时,代码报:invalid bound statement not found 错误
问题分析:这个问题出现在用xml配置mybatis的mapper时,找不到xml具体配置就会报这个错
可能原因1:xml里面的namespace不对 或者id和mapper里面的方法名不一样,或者parameterType对应不上,都会出现这种问题。找到错误的点修改
可能原因2:mapper写在java目录里了,编译的时候这个xml文件并没有被拉到target里面,
解决版本:找pom文件里面build节点下添加上:
<build>
<finalName>isc</finalName>
<!--解决Intellij构建项目时,target/classes目录下不存在mapper.xml文件-->
<resources>
<resource>
<directory>${basedir}/src/main/java</directory>
<includes>
<include>**/*.xml</include>
</includes>
</resource>
<resource>
<directory>${basedir}/src/main/resources</directory>
<includes>
<include>**/*.properties</include>
<include>**/*.xml</include>
<include>**/*.tld</include>
<include>**/*.xls</include>
<include>**/*.xlsx</include>
</includes>
</resource>
</resources>
</build>