你的位置:首页 > Java教程

[Java教程]Java 项目转换成 Maven 项目


本文内容

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

本文主要介绍将 Java 项目转换成 Maven项目。如果你能了解 Java 项目与 Maven 项目在结构上的区别,就很容易将在他们之间进行转换,而不用局限于各种资料上描述的方法。

本文假设你已经成功安装了 Maven。我的 Eclipse 版本是 Eclipse eclipse-jee-mars-R-win32-x86_64 版本 4.5.0,Build id 为 20150621-1200,Maven 是 3.0。

Java 项目


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

目录结构如下图所示:

2015-08-13_0957552015-08-13_100011

图 1 Java 项目在文件系统和 Eclipse 中的结构

说明:

  • src 目录,显然是源代码目录;
  • .classpath 文件,用来描述程序编译的 classpath。比如,新建立的 Java 项目,该文件的可能内容是:
<? 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>

指定了源文件的位置为 src 目录;con 容器为 JRE,标准 VM 虚拟机,JAVA 8 等信息;编译输出位置为 bin 目录。当然,还可以有 lib 相关的信息。如果该项目引用了其他项目,也会在这里。你可以想象,该文件事实上规定了项目在文件系统的物理结构与逻辑结构之间的对应关系。

  • .project 文件,是项目文件,比如,新建立的 Java 项目,该文件的可能内容是:
<? 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>

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

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

Maven 项目


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

2015-08-13_102951 2015-08-13_102858

图 2 Maven 项目在文件系统与 Eclipse 中的结构

说明:

  • 上图左边,Maven 项目比 Java 项目多了 pom.

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

  • 源文件位置,Java 项目只有 src,而 Maven 在 src 下又区分了 main 和 test,其中 main 是主代码,test 是测试代码,显示的样式也有变化。如果你看下 Maven 文件系统的结构,其实它们都是文件目录。你可以想象,当我们修改代码后,可以让 Maven 进行测试,测试完成后,生成 Jar 包,而 Jar 包中是不包含测试代码的;
  • target 目录,跟 Java 项目的 bin 目录对应;
  • Maven Dependencies,Java 项目有 lib 目录,放置三方 Jar 包,当采用 Maven 时,lib 目录就没必要了,因为,Maven 的主要作用是管理项目依赖,它可以从本地仓库或远程仓库获得你需要的 Jar 包,只需在 pom.
  • .classpath 文件,跟 Java 项目区别不大,但是内容会有不同,比如,新建的 Maven 项目,该文件的可能内容是:
<? 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>

注意,classpathentry 的 kind 属性同 Java 项目中的一样,也是“src”、“con”、“output”,但比 Java 项目多,比如,关于 src 的就有两个。但其他属性就有区别了,比如,kind 为 src 的 classpathentry,分别有 path=src/main/java 和 path=src/test/java,指示主代码和测试代码的位置。 
  • .project 文件,比如,新建立的 Maven 项目,该文件的可能内容是:
<? 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>

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

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

Java 项目转换 Maven 项目


首先,文件系统下,在 JavaDemo 的 src 目录下创建 main 和 test 子目录,并在它们下面分别创建 java 子目录。

然后,右键选择 JavaDemo,选择 Configure –> Convert to Maven Project, Group ID 和 Artifact Id 都为 JavaDemo。如图 3 所示:

2015-08-13_113514

图 3 Java 项目编程 Maven 项目

项目图标变了,又多个 pom.

希望你还有印象,前面两节,对 Java 项目和 Maven 项目的 .classpath 文件进行的比较。

因此,IDE 在转换时并没有自定修改 .classpath 文件。而你只需在文件系统,在 src 下,建立 main 和 test 子目录,并在它们下分别建立 java 子目录。然后用修改 .classpath 文件即可。

即:

<? 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>

改成:

<? 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>

此时,JavaDemo 这个项目就会变成如图 4 所示。

2015-08-13_114418

图 4 Java 项目转换成 Maven 项目

这次跟 Maven 项目一样了。

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