本文内容

  • Java 项目
  • Maven 项目
  • Java 项目转换成 Maven 项目

本文主要介绍如何将 Java 项目转换成 Maven 项目。首先要明确的是,用 Maven 管理 Java 项目的确方便。它带给你直观的方便是:你不用在网上找 Jar 包,然后把它复制到 lib 目录,再在项目中引用它。而只需向 pom.xml 写入你需要的 Jar 包依赖,Maven 就能自动从本地仓库或远程仓库下载,并引用……

如何将一般的 Java 项目转换成 Maven 项目?当你了解了 Java 项目与 Maven 项目在结构上的区别后,就能很容易地在它们之间进行转换,而不用局限于各种网络或书上的资料上所描述的方法(有些方法相当不靠谱,照猫画虎,知其然不知其所以然)。

本文假设你已经成功安装了 Maven。

我的 Eclipse 版本是 Eclipse eclipse-jee-mars-R-win32-x86_64 版本 4.5.0,Build id 为 20150621-1200,Maven 是 3.3.3。

Java 项目


用 Eclipse 创建一个 Java 项目,选择“File –> New -> Jave Project”,新建名为“JavaDemo”的项目。

文件系统目录结构如下图所示,之所以强调文件系统,是为了区分项目在 Eclipse 中的目录结构:

图 1 左:Java 项目在文件系统中的结构;右: Java 项目在 Eclipse 中的结构

说明:

  • src 目录,是源代码目录;
  • .classpath 文件,用来描述程序编译的 classpath。比如,上面建立的 Java 项目,该文件的可能内容是:
<?xml version="1.0" encoding="UTF-8"?>

<classpath>

    <classpathentry kind="src" path="src"/>

    <classpathentry kind="con" path="org.eclipse.jdt.launching.JRE_CONTAINER/org.eclipse.jdt.internal.debug.ui.launcher.StandardVMType/JavaSE-1.8"/>

    <classpathentry kind="output" path="bin"/>

</classpath>

.csharpcode, .csharpcode pre
{
font-size: small;
color: black;
font-family: consolas, "Courier New", courier, monospace;
background-color: #ffffff;
/*white-space: pre;*/
}
.csharpcode pre { margin: 0em; }
.csharpcode .rem { color: #008000; }
.csharpcode .kwrd { color: #0000ff; }
.csharpcode .str { color: #006080; }
.csharpcode .op { color: #0000c0; }
.csharpcode .preproc { color: #cc6633; }
.csharpcode .asp { background-color: #ffff00; }
.csharpcode .html { color: #800000; }
.csharpcode .attr { color: #ff0000; }
.csharpcode .alt
{
background-color: #f4f4f4;
width: 100%;
margin: 0em;
}
.csharpcode .lnum { color: #606060; }

指定了源文件的位置为 src 目录;con 容器为 JRE,标准 VM(虚拟机),Java 8 等信息;编译输出位置为 bin 目录。当然,还可以有 lib 目录。你可以想象,该文件实际上指定了 Java 项目在逻辑结构与文件系统的物理结构之间的对应关系。

  • .project 文件,是项目文件,比如,还是上面项目,该文件的可能内容是:
<?xml version="1.0" encoding="UTF-8"?>

<projectDescription>

    <name>JavaDemo</name>

    <comment></comment>

    <projects>

    </projects>

    <buildSpec>

        <buildCommand>

            <name>org.eclipse.jdt.core.javabuilder</name>

            <arguments>

            </arguments>

        </buildCommand>

    </buildSpec>

    <natures>

        <nature>org.eclipse.jdt.core.javanature</nature>

    </natures>

</projectDescription>

.csharpcode, .csharpcode pre
{
font-size: small;
color: black;
font-family: consolas, "Courier New", courier, monospace;
background-color: #ffffff;
/*white-space: pre;*/
}
.csharpcode pre { margin: 0em; }
.csharpcode .rem { color: #008000; }
.csharpcode .kwrd { color: #0000ff; }
.csharpcode .str { color: #006080; }
.csharpcode .op { color: #0000c0; }
.csharpcode .preproc { color: #cc6633; }
.csharpcode .asp { background-color: #ffff00; }
.csharpcode .html { color: #800000; }
.csharpcode .attr { color: #ff0000; }
.csharpcode .alt
{
background-color: #f4f4f4;
width: 100%;
margin: 0em;
}
.csharpcode .lnum { color: #606060; }

指定了项目名称 JavaDemo,项目描述信息,生成命令,核心等信息。

接下来,再看看 Maven 项目是什么样的。

Maven 项目


用 Eclipse 新建一个 Maven 项目,选择“File –> New-> Other”,找到“Maven –> Maven Project”,Archetype 选择“quickstart”,Group ID 和 Artifact Id 都为 mavenDemo,

图 2 左:Maven 项目在文件系统中的结构;右:Maven 项目在 Eclipse 中的结构

说明:

  • 上图左边,Maven 项目比 Java 项目多了 pom.xml,即 Project Object Model,该文件本文就不介绍了;

上图右边,Eclipse 的内容变化就比较多了,甚至连项目图标都变了,右上角有个“J”,左上角多个“M”,包括:

  • 源文件位置,Java 项目只有 src,而 Maven 在 src 下又区分了 main 和 test,其中 main 是主代码,test 是测试代码,显示样式也有变化,如 src/main/java。如果你看下 Maven 的文件系统结构,其实它们都是文件夹。可以想象,当我们修改代码后,可以让 Maven 进行测试,测试完成后,生成 Jar 包,而 Jar 包中不包含测试代码。这就是如此划分的好处;
  • target 目录,跟 Java 项目的 bin 目录作用一样;
  • Maven Dependencies,Java 项目有 lib 目录,用来放置你使用的三方 Jar 包。当采用 Maven 时,lib 目录就没用了。Maven 的主要作用是管理项目依赖,它可以从本地仓库或远程仓库获得你需要的 Jar 包,即便是你自己写的 Java 项目,也完全不用再配置“Configure Build Path”,只需向 pom.xml 添加 dependency 节点,写上你引用项目的 Group Id 和 Artfact Id,就能直接引用。想象一下,如果没有 Maven,当你使用三方 Jar 包时,通常会先建立一个 lib 目录,然后把 Jar 包复制到这里,再通过“Configure Build Path” 引用它们,有了 Maven 后,这些步骤,就统统不用了(差点忘了,你还得在网上找到你需要的 Jar 包,并下载本地);
  • .classpath 文件,跟 Java 项目区别不大,但内容会不同,比如,上面新建的 Maven 项目,该文件的可能内容是:
<?xml version="1.0" encoding="UTF-8"?>

<classpath>

    <classpathentry kind="src" output="target/classes" path="src/main/java">

        <attributes>

            <attribute name="optional" value="true"/>

            <attribute name="maven.pomderived" value="true"/>

        </attributes>

    </classpathentry>

    <classpathentry kind="src" output="target/test-classes" path="src/test/java">

        <attributes>

            <attribute name="optional" value="true"/>

            <attribute name="maven.pomderived" value="true"/>

        </attributes>

    </classpathentry>

    <classpathentry kind="con" path="org.eclipse.jdt.launching.JRE_CONTAINER/org.eclipse.jdt.internal.debug.ui.launcher.StandardVMType/JavaSE-1.8">

        <attributes>

            <attribute name="maven.pomderived" value="true"/>

        </attributes>

    </classpathentry>

    <classpathentry kind="con" path="org.eclipse.m2e.MAVEN2_CLASSPATH_CONTAINER">

        <attributes>

            <attribute name="maven.pomderived" value="true"/>

        </attributes>

    </classpathentry>

    <classpathentry kind="output" path="target/classes"/>

</classpath>

.csharpcode, .csharpcode pre
{
font-size: small;
color: black;
font-family: consolas, "Courier New", courier, monospace;
background-color: #ffffff;
/*white-space: pre;*/
}
.csharpcode pre { margin: 0em; }
.csharpcode .rem { color: #008000; }
.csharpcode .kwrd { color: #0000ff; }
.csharpcode .str { color: #006080; }
.csharpcode .op { color: #0000c0; }
.csharpcode .preproc { color: #cc6633; }
.csharpcode .asp { background-color: #ffff00; }
.csharpcode .html { color: #800000; }
.csharpcode .attr { color: #ff0000; }
.csharpcode .alt
{
background-color: #f4f4f4;
width: 100%;
margin: 0em;
}
.csharpcode .lnum { color: #606060; }注意,classpathentry 的 kind 属性同 Java 项目中的一样,也有“src”、“con”、“output”,但比 Java 项目多,比如,关于 src 的就有两个。但其属性就有区别了,比如,kind 为 src 的 classpathentry,分别有 path=src/main/java 和 path=src/test/java,指示主代码和测试代码的位置。

  • .project 文件,比如,还是上面 Maven 项目,该文件的可能内容是:
<?xml version="1.0" encoding="UTF-8"?>

<projectDescription>

    <name>mavenDemo</name>

    <comment></comment>

    <projects>

    </projects>

    <buildSpec>

        <buildCommand>

            <name>org.eclipse.jdt.core.javabuilder</name>

            <arguments>

            </arguments>

        </buildCommand>

        <buildCommand>

            <name>org.eclipse.m2e.core.maven2Builder</name>

            <arguments>

            </arguments>

        </buildCommand>

    </buildSpec>

    <natures>

        <nature>org.eclipse.jdt.core.javanature</nature>

        <nature>org.eclipse.m2e.core.maven2Nature</nature>

    </natures>

</projectDescription>

.csharpcode, .csharpcode pre
{
font-size: small;
color: black;
font-family: consolas, "Courier New", courier, monospace;
background-color: #ffffff;
/*white-space: pre;*/
}
.csharpcode pre { margin: 0em; }
.csharpcode .rem { color: #008000; }
.csharpcode .kwrd { color: #0000ff; }
.csharpcode .str { color: #006080; }
.csharpcode .op { color: #0000c0; }
.csharpcode .preproc { color: #cc6633; }
.csharpcode .asp { background-color: #ffff00; }
.csharpcode .html { color: #800000; }
.csharpcode .attr { color: #ff0000; }
.csharpcode .alt
{
background-color: #f4f4f4;
width: 100%;
margin: 0em;
}
.csharpcode .lnum { color: #606060; }

Maven 的 .project 文件,除了有关于 Java 的,还添加了它自己的。

本质上,Maven 接管了 Java 项目的管理。

Java 项目转换 Maven 项目


首先,右键选择 JavaDemo,选择“Configure –> Convert to Maven Project”, 填写“Group ID”和“Artifact Id”都为“JavaDemo”。如图 3 所示:

图 3 Java 项目编程 Maven 项目

可以看到,项目图标变了,多了 pom.xml,Maven Dependencies,target 等。但 src 代码位置不对,没有指示出主代码和测试代码。

希望你还有印象,前面两小节,对 Java 项目和 Maven 项目的 .classpath 文件进行的比较。因此,IDE 在转换时没有自动修改 .classpath 文件。

而你只需在文件系统下,在 src 目录下建立 main 和 test 子目录,并在它们下再分别建立 java 子目录。也就是,src/main/java,src/test/java。然后修改 .classpath 文件,或用一个现成的 Maven .classpath 文件覆盖它即可。

将:

<?xml version="1.0" encoding="UTF-8"?>
<classpath>
    <classpathentry kind="src" output="target/classes" path="src">
        <attributes>
            <attribute name="optional" value="true"/>
            <attribute name="maven.pomderived" value="true"/>
        </attributes>
    </classpathentry>
    <classpathentry kind="con" path="org.eclipse.jdt.launching.JRE_CONTAINER/org.eclipse.jdt.internal.debug.ui.launcher.StandardVMType/JavaSE-1.8">
        <attributes>
            <attribute name="maven.pomderived" value="true"/>
        </attributes>
    </classpathentry>
    <classpathentry kind="con" path="org.eclipse.m2e.MAVEN2_CLASSPATH_CONTAINER">
        <attributes>
            <attribute name="maven.pomderived" value="true"/>
        </attributes>
    </classpathentry>
    <classpathentry kind="output" path="target/classes"/>
</classpath>

.csharpcode, .csharpcode pre
{
font-size: small;
color: black;
font-family: consolas, "Courier New", courier, monospace;
background-color: #ffffff;
/*white-space: pre;*/
}
.csharpcode pre { margin: 0em; }
.csharpcode .rem { color: #008000; }
.csharpcode .kwrd { color: #0000ff; }
.csharpcode .str { color: #006080; }
.csharpcode .op { color: #0000c0; }
.csharpcode .preproc { color: #cc6633; }
.csharpcode .asp { background-color: #ffff00; }
.csharpcode .html { color: #800000; }
.csharpcode .attr { color: #ff0000; }
.csharpcode .alt
{
background-color: #f4f4f4;
width: 100%;
margin: 0em;
}
.csharpcode .lnum { color: #606060; }改成:

<?xml version="1.0" encoding="UTF-8"?>
<classpath>
    <classpathentry kind="src" output="target/classes" path="src/main/java">
        <attributes>
            <attribute name="optional" value="true"/>
            <attribute name="maven.pomderived" value="true"/>
        </attributes>
    </classpathentry>
    <classpathentry kind="src" output="target/test-classes" path="src/test/java">
        <attributes>
            <attribute name="optional" value="true"/>
            <attribute name="maven.pomderived" value="true"/>
        </attributes>
    </classpathentry>
    <classpathentry kind="con" path="org.eclipse.jdt.launching.JRE_CONTAINER/org.eclipse.jdt.internal.debug.ui.launcher.StandardVMType/JavaSE-1.8">
        <attributes>
            <attribute name="maven.pomderived" value="true"/>
        </attributes>
    </classpathentry>
    <classpathentry kind="con" path="org.eclipse.m2e.MAVEN2_CLASSPATH_CONTAINER">
        <attributes>
            <attribute name="maven.pomderived" value="true"/>
        </attributes>
    </classpathentry>
    <classpathentry kind="output" path="target/classes"/>
</classpath>

.csharpcode, .csharpcode pre
{
font-size: small;
color: black;
font-family: consolas, "Courier New", courier, monospace;
background-color: #ffffff;
/*white-space: pre;*/
}
.csharpcode pre { margin: 0em; }
.csharpcode .rem { color: #008000; }
.csharpcode .kwrd { color: #0000ff; }
.csharpcode .str { color: #006080; }
.csharpcode .op { color: #0000c0; }
.csharpcode .preproc { color: #cc6633; }
.csharpcode .asp { background-color: #ffff00; }
.csharpcode .html { color: #800000; }
.csharpcode .attr { color: #ff0000; }
.csharpcode .alt
{
background-color: #f4f4f4;
width: 100%;
margin: 0em;
}
.csharpcode .lnum { color: #606060; }此时,JavaDemo 这个项目就会变成如图 4 所示,如果你着急,就按 F5 刷新。

图 4 Java 项目转换成 Maven 项目

现在,这个 Java 项目就跟 Maven 创建的项目一样了。

了解这个原理,你也能将 Maven 项目转换成 Java 项目。

另外,你会发现 Eclipse 这个 IDE 一个方便的地方是,即便 Eclipse 已经打开了你的项目,你也可以在操作系统的资源管理器上随意操作文件和文件夹(当然,我说的是 Windows 操作系统),这跟一些其他的 IDE 不同,比如微软的 VS,你就不能这么干,原因很简单,对一个 IDE 正在访问的文件,又在操作系统的资源管理里对文件进行剪切或删除,IDE 显然不会答应。但是 Eclipse 就跟 Notepad 或 UE 这些文本编辑器似的,会监视文件,但不会阻止你做你想做的事,给程序员最大的灵活度和自由度,这也是 Java 的理念之一。所以,在 Maven 项目与 Java 项目进行转换成,无所谓先进行哪步,后进行哪步,如图 3,项目中有 pom.xml 文件了,即便 .classpath 文件不正确,那么这个项目的图标也会已变成 Maven 图标,之前的 bin 目录或 lib 目录也会存在,虽然 Maven 完全不需要它们,而且主代码和测试代码的显示也完全不对,甚至,还会出现完全按操作系统的一级又一级……的目录结构来显示,而不是逻辑结构——Java 包的方式来显示~如果最终所有的修改达到 Maven的要求,它就能正确显示结构。

如何将 Java 项目转换成 Maven 项目的更多相关文章

  1. Myeclipse Java项目转换成Maven项目

    1.在Eclipse中Java项目转换成Maven项目可以在项目右键-->configure-->Convert Plug-in projects..  就可以.而在myeclipse中项 ...

  2. Maven 学习笔记——将普通的Java项目转换成Maven项目(3)

    将一个普通的java项目转换成Maven项目并不是一个很大的任务,仅仅只需要下面的几步就能将转换成功.下面我是用一个简单的Selenium测试小demon作为例子来说的. 移调项目中所有关联的Libr ...

  3. 转:如何将 Java 项目转换成 Maven 项目

    如何将 Java 项目转换成 Maven 项目 本文内容 Java 项目 Maven 项目 Java 项目转换成 Maven 项目 本文主要介绍如何将 Java 项目转换成 Maven 项目.首先要明 ...

  4. 把Eclipse项目转换成Maven项目

    把Maven项目转换成Eclipse项目只要使用Maven的Eclipse插件就能做到 mvn eclipse:eclipse 其实Maven的Eclipse插件也有把Eclipse项目转换成Mave ...

  5. idea中将项目转换成Maven项目

    第一步:项目右键->Add Framework... 选择maven ok 这样就成功转换成了一个maven项目

  6. 把普通java项目转换成maven项目

    我使用的是eclipse,右键项目,Configure->Convert to Maven Project 然后就是jar包的引入了,如果jar包比较简单,建议从maven中拉取,这样便于后期升 ...

  7. 普通项目转换成maven项目

    参看文档:http://czj4451.iteye.com/blog/1983889 maven仓库:http://mvnrepository.com/     基本步骤如下: Configue--& ...

  8. 使用cmd命令创建maven(web)项目+项目转换成IDEA项目+项目打包+Jetty运行Web项目

    3条件:配置好环境 配置环境教程:https://www.cnblogs.com/weibanggang/p/9623705.html 第一步:查看版本信息,在cmd输入mvn –version,如果 ...

  9. 将普通java工程转换成maven工程

    在MyEclipse10中将Maven项目转成普通Java项目后,想将Java项目转成Maven项目,结果一下子傻眼了.根本就没有攻略中提到的config标签.仔细一看,喵咪的,人家用的是Eclips ...

随机推荐

  1. MFC单文档

    一.创建并运行MFC单文档程序 1.创建单文档程序 这里使用的是VS2017.首先,打开VS2017,选择文件->新建->项目,然后选择Visual C++ -> MFC /ATL& ...

  2. poj1470 LCA倍增法

    倍增法模板题 #include<iostream> #include<cstring> #include<cstdio> #include<queue> ...

  3. web中切图、快速切图与web雪碧图制作的方法

    声明: web小白的笔记,欢迎大神指点,联系QQ:1522025433. 工具:Photoshop 1.复制文字:点击文章工具后选择文字. 2.矩形选框工具 看信息 f8, 取消矩形选框 Ctrl+D ...

  4. python 全栈开发,Day129(玩具开机提示语,为多个玩具发送点播,聊天界面,app录音,app与服务器端文件传输,简单的对话)

    一.玩具开机提示语 先下载github代码,下面的操作,都是基于这个版本来的! https://github.com/987334176/Intelligent_toy/archive/v1.2.zi ...

  5. hdu 1217 汇率 Floyd

    题意:给几个国家,然后给这些国家之间的汇率.判断能否通过这些汇率差进行套利交易. Floyd的算法可以求出任意两点间的最短路径,最后比较本国与本国的汇率差,如果大于1,则可以.否则不可以. 有向图 一 ...

  6. sum of powers

    题意: 考虑所有的可重集{a1,a2,a3....ak} 满足a1+a2+....+ak=n,求所有a1^m+a2^m+a3^m的和 n,m,k<=5000 题解: part1: 考虑f[i][ ...

  7. A. 【UNR #2】积劳成疾

    链接:http://uoj.ac/contest/40/problem/311 题解: 一道很好的期望题吧 用dp的老思路,枚举最大值将序列分割 想到这个就很简单了 状态f[i][j]表示前i个,最大 ...

  8. python 中的可变对象与不可变对象

    近日辞职待工,没有实际的项目与大家分享.暂写写在实际运用python中遇到的关于可变对象和不可变对象的坑. 首先我们需要明确一个概念,在python中一且皆对象.我们一般定义一个变量a=0,其实质a是 ...

  9. rabbitmq学习(七) —— springboot下的可靠使用

    前面的学习都是基于原生的api,下面我们使用spingboot来整合rabbitmq springboot对rabbitmq提供了友好支持,极大的简化了开发流程 引入maven <depende ...

  10. 算法进阶面试题04——平衡二叉搜索树、AVL/红黑/SB树、删除和调整平衡的方法、输出大楼轮廓、累加和等于num的最长数组、滴滴Xor

    接着第三课的内容和讲了第四课的部分内容 1.介绍二叉搜索树 在二叉树上,何为一个节点的后继节点? 何为搜索二叉树? 如何实现搜索二叉树的查找?插入?删除? 二叉树的概念上衍生出的. 任何一个节点,左比 ...