前言
最近在学习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项目的骨架了,我们可以选择一个即可。 选择quickstart,这里输入7回车。
然后会出现提示,依次输入项目groupId、artifactId、version以及package最后输入Y即可。如下图:
之后会自动创建好项目,生成的文件夹名就是之前填写的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-resources
、META-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开头的那个即可。
eclipse应用
依次进入菜单栏Window——>Preferences——>Maven——Archetypes
,如图所示,添加本地或远程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为我们之前配置的即可
IDEA 应用
File——New——Project… 选择Maven项目,勾选Create from archetype,然后再点击右边的Add Archetype,如下图:
输入需要使用的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