自定义MavenHadoop项目骨架

导读:本篇文章讲解 自定义MavenHadoop项目骨架,希望对大家有帮助,欢迎收藏,转发!站点地址:www.bmabk.com

前言

最近在学习Hadoop,每次创建项目都要复制之前项目的pom.xml通用文件,也是比较烦的。正好记得Maven可以创建自己的项目骨架的,也即是Archetype。有了项目骨架,不但pom.xml通用自动生成,还可以生成项目默认的Driver启动类等等。

环境

  • Maven 3.3.9
  • JDK 1.8
  • Eclipse Neon.2 Release (4.6.2)
  • IntelliJ IDEA 2016.3.4
  • Sonatype Nexus 3.x

配置

首先将Maven和JDK都加入环境变量,这个就不多说。Eclipse下载最新版本就好,Nexus只是为了将其上传到远程仓库,方便其他电脑也可以使用。 工具都准备好了以后,开始配置了。 Windows系统打开C:\Users\[登录的用户名]\.m2\settings.xml Linux系统打开:~/.m2/settings.xml 如果没有该文件则创建,添加内容如下:

<?xml version="1.0" encoding="UTF-8"?>
<settings xmlns="http://maven.apache.org/SETTINGS/1.0.0"
          xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
          xsi:schemaLocation="http://maven.apache.org/SETTINGS/1.0.0 http://maven.apache.org/xsd/settings-1.0.0.xsd">

    <servers>
        <server>
            <id>releases</id>
            <username>admin</username>
            <password>admin123</password>
        </server>

        <server>
            <id>snapshots</id>
            <username>admin</username>
            <password>admin123</password>
        </server>
    </servers>

</settings>  

创建骨架

一开始我们可以创建一个目录,用于存放项目文件与文件夹。为了避免创建一大堆的目录,我们可以基于通用的apache骨架进行创建。 打开命令行,输入以下命令: mvn archetype:generate 默认就会出来一些apache项目的骨架了,我们可以选择一个即可。 mvn_archetype 选择quickstart,这里输入7回车。

然后会出现提示,依次输入项目groupIdartifactIdversion以及package最后输入Y即可。如下图: archetype_info

之后会自动创建好项目,生成的文件夹名就是之前填写的artifactId

配置项目pom

进入项目目录,打开pom.xml文件默认为以下内容:

<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.infosys.hadoop</groupId>
  <artifactId>hadoop-archetype</artifactId>
  <version>1.0-SNAPSHOT</version>
  <packaging>jar</packaging>

  <name>hadoop-archetype</name>
  <url>http://maven.apache.org</url>

  <properties>
    <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
  </properties>

  <dependencies>
    <dependency>
      <groupId>junit</groupId>
      <artifactId>junit</artifactId>
      <version>3.8.1</version>
      <scope>test</scope>
    </dependency>
  </dependencies>
</project

现在我们就需要进行定制改造了。首先修改<packageing>标签属性值为maven-archetype, 删除<url>标签,项目的依赖也删除掉,最后添加自己的内容,如上传的仓库地址,插件什么的。最后内容如下:

<?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.infosys.hadoop</groupId>
    <artifactId>hadoop-archetype</artifactId>
    <version>1.0.0</version>

    <packaging>maven-archetype</packaging>


    <distributionManagement>
        <repository>
            <id>releases</id>
            <url>http://192.168.1.2:8081/repository/maven-releases/</url>
        </repository>
        <snapshotRepository>
            <id>snapshots</id>
            <url>http://192.168.1.2:8081/repository/maven-snapshots/</url>
        </snapshotRepository>
    </distributionManagement>


    <build>
        <finalName>${project.artifactId}</finalName>

        <extensions>
            <extension>
                <groupId>org.apache.maven.archetype</groupId>
                <artifactId>archetype-packaging</artifactId>
                <version>2.4</version>
            </extension>
        </extensions>

        <pluginManagement>
            <plugins>
                <plugin>
                    <groupId>org.apache.maven.plugins</groupId>
                    <artifactId>maven-archetype-plugin</artifactId>
                </plugin>

                <plugin>
                    <groupId>org.apache.maven.plugins</groupId>
                    <artifactId>maven-resources-plugin</artifactId>
                    <configuration>
                        <encoding>UTF-8</encoding>
                    </configuration>
                </plugin>
            </plugins>
        </pluginManagement>

    </build>
</project>

配置骨架内容

自定义的骨架还要有依赖的包和文件,就如我们使用apache quickstart骨架,它默认就在项目的pom.xml文件中给我们加了一个junit依赖。我们也需要再加一些hadoop相关的其他依赖了。

进入项目的src/main/目录,然后创建resources文件夹。再进入resources文件夹,分别创建 archetype-resourcesMETA-INF文件夹,再进入META-INF目录创建maven子文件夹。 最后目录结构如下:

.
├── pom.xml
└── src
    ├── main
    │   ├── java
    │   │   └── com
    │   │       └── infosys
    │   │           └── hadoop
    │   │               └── App.java
    │   └── resources
    │       ├── archetype-resources
    │       └── META-INF
    │           └── maven
    └── test
        └── java
            └── com
                └── infosys
                    └── hadoop
                        └── AppTest.java

创建骨架生成的pom

进入archetype-resources目录,创建pom.xml文件,该文件就是最终骨架中包含的文件。也即是根据这个骨架生成的项目中的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>${groupId}</groupId>
    <artifactId>${artifactId}</artifactId>
    <version>${version}</version>

    <name>${artifactId}</name>

    <packaging>jar</packaging>

    <properties>
        <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
        <hadoop.version>2.6.5</hadoop.version>
    </properties>

    <dependencies>
        <dependency>
            <groupId>org.apache.hadoop</groupId>
            <artifactId>hadoop-client</artifactId>
            <version>${hadoop.version}</version>
        </dependency>

        <!-- Test -->
        <dependency>
            <groupId>junit</groupId>
            <artifactId>junit</artifactId>
            <version>4.12</version>
            <scope>test</scope>
        </dependency>

        <dependency>
            <groupId>org.apache.mrunit</groupId>
            <artifactId>mrunit</artifactId>
            <version>1.1.0</version>
            <classifier>hadoop2</classifier>
            <scope>test</scope>
        </dependency>

        <dependency>
            <groupId>org.apache.hadoop</groupId>
            <artifactId>hadoop-minicluster</artifactId>
            <version>${hadoop.version}</version>
            <scope>test</scope>
        </dependency>
    </dependencies>


    <build>
        <finalName>${project.artifactId}</finalName>
        <plugins>
            <plugin>
                <groupId>org.apache.maven.plugins</groupId>
                <artifactId>maven-archetype-plugin</artifactId>
                <version>2.2</version>
            </plugin>

            <plugin>
                <groupId>org.apache.maven.plugins</groupId>
                <artifactId>maven-resources-plugin</artifactId>
                <configuration>
                    <encoding>UTF-8</encoding>
                </configuration>
            </plugin>

            <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>
                </configuration>
            </plugin>

            <plugin>
                <groupId>org.apache.maven.plugins</groupId>
                <artifactId>maven-jar-plugin</artifactId>
                <version>2.5</version>
                <configuration>
                    <outputDirectory>${basedir}</outputDirectory>
                </configuration>
            </plugin>
        </plugins>
    </build>
</project>

这个可根据具体的情况来,想要生成什么就添加什么。

创建骨架生成的java文件

所谓骨架生成的java文件就是根据这个骨架生成的项目,自动生成项目包名和一个启动开始类。其中的内容还可以进一步定制。 在archetype-resources目录下,创建src/main/java子目录。然后在最里面的java目录中创建Driver.java文件。这个就是最终骨架会生成的项目文件,内容如下:

package ${package};

public class Driver {
    public static void main(String[] args) {
        System.out.println("Hello Hadoop");
    }
}

创建骨架描述文件

描述文件也可以说是元文件,包含说明哪些需要生成,哪些不需要。 在META-INF/maven目录下,创建archetype-metadata.xml文件,内容如下:

<?xml version="1.0" encoding="UTF-8" ?>
<archetype-descriptor name="sample">
    <fileSets>
        <fileSet filtered="true" packaged="true">
            <directory>src/main/java</directory>
            <includes>
                <include>**/*.java</include>
            </includes>
        </fileSet>

        <fileSet filtered="true" packaged="true">
            <directory>src/test/java</directory>

            <includes>
                <include>**/*.java</include>
            </includes>
        </fileSet>

        <fileSet filtered="true" packaged="false">
            <directory>src/main/resources</directory>
            <includes>
                <include>**/*.properties</include>
            </includes>
        </fileSet>
    </fileSets>

    <requiredProperties>
        <requiredProperty key="groupId">
            <defaultValue>com.infosys.hadoop</defaultValue>
        </requiredProperty>
    </requiredProperties>
</archetype-descriptor>

格式也很简单,packaged="false"表示不包含在生成的项目包名结构中,为true表示包含包结构。 也即是添加一层项目包名结构,如:resources/com.xxx.xxx/*.properties

更多的说明可参看官方文档:

编译打包

生成骨架模板

基本上都已经配置完了,剩下的就是编译打包,应用。 回头再看下整个项目的结构:

 .
├── pom.xml
└── src
    ├── main
    │   ├── java
    │   │   └── com
    │   │       └── infosys
    │   │           └── hadoop
    │   │               └── App.java
    │   └── resources
    │       ├── archetype-resources
    │       │   ├── pom.xml
    │       │   └── src
    │       │       └── main
    │       │           └── java
    │       │               └── Driver.java
    │       └── META-INF
    │           └── maven
    │               └── archetype-metadata.xml
    └── test
        └── java
            └── com
                └── infosys
                    └── hadoop
                        └── AppTest.java

我们回到项目最顶层,执行以下命令: mvn archetype:create-from-project 从一个已有的项目中生成一个骨架模板。 执行成功后,会提示骨架项目创建的位置:target/generated-sources/archetype 进入该目录看看就知道了。

上传到仓库

进入target/generated-sources/archetype目录,执行以下命令: mvn clean install 将其上传到本地仓库。

然后更新本地仓库索引,继续在该目录下执行: mvn archetype:update-local-catalog

上传远程服务器,回到项目根目录: mvn deploy

应用

命令行应用

在命令行的应用很简单,新建一个空文件夹,然后执行以下命令即可: mvn archetype:generate 进入交互界面会出现以下提示: local 选择最下面带有local开头的那个即可。

eclipse应用

依次进入菜单栏Window——>Preferences——>Maven——Archetypes,如图所示,添加本地或远程Catalog即可: Catalog

本地Catalog文件一般在本地Maven仓库目录中,如果在Maven的settings.xml文件中配置了<localRepository>属性,则到该目录中去找就行了。文件名就是:archetype-catalog.xml

如果是远程的话,就需要指定服务器中的地址了。如我这里使用的是Nexus 3.x,上传的仓库是maven-releases,则路径就是:http://192.168.1.2:8081/repository/maven-releases/archetype-catalog.xml

最后在Eclipse中创建一个Maven项目,选择Catalog为我们之前配置的即可 new_maven

IDEA 应用

File——New——Project… 选择Maven项目,勾选Create from archetype,然后再点击右边的Add Archetype,如下图: idea_maven

输入需要使用的Archetype属性, add_archetype

完成后点击OK,就可以在下面的列表中找到这个了。 选中我们刚刚创建的Archetype,最后点击Next进入下一步,输入新建的项目GroupId、ArtifactId和Version属性即可。

在这里有个地方需要注意,IDEA好像没有提供一个可删除我们自己创建的archetype选项。我们可以到系统登录用户的Home目录下面找到这个文件,可以修改和删除我们刚刚创建的archetype的。 C:\Users\lu\.IntelliJIdea2016.3\system\Maven\Indices\UserArchetypes.xml 中间的lu就是我当前登录的用户名,这个可能都会不一样需要注意。

最后再推荐一款Intellij IDEA 插件:Maven Archetype Catalogs,在Settings—>Plugins—>Browse repositories…中搜索就可以找到,安装好这个插件后就不用每次手动的创建archetype然后再跟远程关联了。就类似eclipse一样,设置好远程的archetype-catalog.xml路径就可以显示所有的远程archetype了。进入Settings—>Build,Execution,Deployment—>Maven Archetype Catalogs中添加远程路径即可。

后记

每次写博客都感觉好累啊,不过既增强了实践经验,又方便了自己后来使用,并且有可能还会帮助到其他人。还是挺不错的。其实网上也有很多这方面的博客教程,为什么还要写呢?因为网上的东西一个残缺不全,不可靠,很少有完全依着来能成功的。二个别人的东西始终是别人的,照葫芦画瓢转身又忘记,下次要用的时候又要去找半天,挺烦的。这个Maven自定义骨架我也是第一次使用,尽管网上有不少教程,但是中间还是走了不少的坑。一度都想放弃了。不过为了最终还是坚持下来了。感觉自己又进步不少:)

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 举报,一经查实,本站将立刻删除。

文章由极客之音整理,本文链接:https://www.bmabk.com/index.php/post/2036.html

(0)
小半的头像小半

相关推荐

极客之音——专业性很强的中文编程技术网站,欢迎收藏到浏览器,订阅我们!