本系列博文有很长一段时间没有更新了,一切源于这期间由一些其他时请需要处理,同时自己也有点松懈了,接下来需要追赶上来了。
本文将演示使用eclipse中的maven进行简单的项目的依赖管理、打包配置以及进行打包。
0、准备工作
eclipse中创建全空的maven项目(packaging为jar),如果不清楚的,可以参考前面的文章。
刚创建完成之后,文件树是这样的
BlogExample2
├── .classpath
├── .git
│ ├── branches
│ ├── config
│ ├── FETCH_HEAD
│ ├── HEAD
│ ├── hooks
│ ├── index
│ ├── logs
│ │ ├── HEAD
│ │ └── refs
│ │ ├── heads
│ │ │ └── master
│ │ └── remotes
│ │ └── origin
│ │ └── master
│ ├── objects
│ │ ├── 09
│ │ │ └── 0de75a2fb3f838ed0e09b06245beac15375223
│ │ ├── 36
│ │ │ └── c8b0cdf2d254b97d1dbd56873a5e5ff3c89402
│ │ ├── aa
│ │ │ └── 461803a95b3ebff7356772ea379029694fce09
│ │ ├── d6
│ │ │ └── 9a0381ef76acc3e0cd248aae28de88b5b00c95
│ │ ├── db
│ │ │ └── 9ae43e25a6aa124f886fd9dccbff8c4ffdf81f
│ │ ├── info
│ │ └── pack
│ │ ├── pack-b98bb4645cb790f02c640335d24f5a934ea93be8.idx
│ │ └── pack-b98bb4645cb790f02c640335d24f5a934ea93be8.pack
│ └── refs
│ ├── heads
│ │ └── master
│ ├── remotes
│ │ └── origin
│ │ └── master
│ └── tags
├── .gitignore
├── LICENSE
├── pom.xml
├── .project
├── README.md
├── .settings
│ ├── org.eclipse.core.resources.prefs
│ ├── org.eclipse.jdt.core.prefs
│ └── org.eclipse.m2e.core.prefs
└── target
├── classes
└── test-classes
1、配置编码
为了避免和解决各种由于编码不一致导致的问题,我们需要对我们的项目配置统一的编码,一般设置为UTF-8编码,需要在pom.xml中配置
<properties>
<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
<project.reporting.outputEncoding>UTF-8</project.reporting.outputEncoding>
</properties>
2、配置依赖
我们经常需要依赖其他的库来完成代码编写,一般我们可以在相关库的介绍中找到maven依赖配置信息,如果没有,可以通过maven中央仓库进行搜索。
对于一个依赖,我们一般需要配置3项:groupId、artifactId、version,对于少数情况,我们还需要配置scope。前三项是唯一确定依赖库的三元素,后面那一项是为了告诉maven这个依赖的使用范围。
假设我们需要依赖mysql的jdbc驱动,我们需要配置:
<dependencies>
<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
<version>${version.mysql-jdbc}</version>
<scope>${prop.depScope}</scope>
</dependency>
</dependencies>
这个,我将版本和范围都使用了变量的方式来配置,这两个变量需要在标签<properties>中进行配置,如:
<properties>
<version.mysql-jdbc>5.1.38</version.mysql-jdbc>
<prop.depScope>provided</prop.depScope>
</properties>
采用这种变量的方式配置,好处在于可以重复使用这个变量,因为有一些依赖库是需要配置几个依赖的,如spring、log4j2,这样就可以做到一改全改,方便维护,请看这个:
<properties>
<version.spring>4.2.6.RELEASE</version.spring>
<version.log4j>2.5</version.log4j>
<prop.depScope>compile</prop.depScope>
</properties>
<dependencies>
<!-- spring -->
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-jdbc</artifactId>
<version>${version.spring}</version>
<scope>${prop.depScope}</scope>
</dependency>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-webmvc</artifactId>
<version>${version.spring}</version>
<scope>${prop.depScope}</scope>
</dependency>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-context-support</artifactId>
<version>${version.spring}</version>
<scope>${prop.depScope}</scope>
</dependency>
<!-- 日志 -->
<dependency>
<groupId>org.apache.logging.log4j</groupId>
<artifactId>log4j-jcl</artifactId>
<version>${version.log4j}</version>
<scope>${prop.depScope}</scope>
</dependency>
<dependency>
<groupId>org.apache.logging.log4j</groupId>
<artifactId>log4j-web</artifactId>
<version>${version.log4j}</version>
<scope>${prop.depScope}</scope>
</dependency>
</dependencies>
3、配置打包插件
配置了依赖,就可以愉快的写代码了,然后代码携带一定时候就需要打包、测试了,这个时候就需要配置相应的打包的配置了。maven默认的关于打包的配置已经使得你能够不进行任何配置了,但是对于某些有特别需求的场景还时需要进行配置的。
除了
<packaging>xxxx</packaging>
这个配置以外,所有的关于打包的配置都在<build>标签里面,主要是关于源代码文件路径、配置文件路径、输出文件名、输出路径、编译参数、打包包含和排除文件、javadoc生成等等。很多都是以插件的形式提供,也有部分配置是直接标签进行配置,官方插件可以参看官方的文档进行配置。
<properties>
<version.java>1.8</version.java>
<version.javadoc>8</version.javadoc>
<version.compiler-plugin>3.5.1</version.compiler-plugin>
<version.war-plugin>2.6</version.war-plugin>
<version.clean-plugin>3.0.0</version.clean-plugin>
<version.resources-plugin>2.7</version.resources-plugin>
<version.surefire-plugin>2.19.1</version.surefire-plugin>
<version.jar-plugin>2.6</version.jar-plugin>
<version.source-plugin>3.0.0</version.source-plugin>
<version.javadoc-plugin>2.10.3</version.javadoc-plugin>
<version.gpg-plugin>1.6</version.gpg-plugin>
</properties>
<build>
<plugins>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-compiler-plugin</artifactId>
<version>${version.compiler-plugin}</version>
<configuration>
<source>${version.java}</source>
<target>${version.java}</target>
</configuration>
</plugin>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-jar-plugin</artifactId>
<version>${version.jar-plugin}</version>
</plugin>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-war-plugin</artifactId>
<version>${version.war-plugin}</version>
<configuration>
<failOnMissingWebXml>false</failOnMissingWebXml>
</configuration>
</plugin>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-source-plugin</artifactId>
<version>${version.source-plugin}</version>
<executions>
<execution>
<id>attach-sources</id>
<goals>
<goal>jar-no-fork</goal>
</goals>
</execution>
</executions>
<configuration>
<attach>true</attach>
</configuration>
</plugin>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-javadoc-plugin</artifactId>
<version>${version.javadoc-plugin}</version>
<executions>
<execution>
<phase>package</phase>
<goals>
<goal>jar</goal>
</goals>
</execution>
</executions>
<configuration>
<links>
<link>http://docs.oracle.com/javase/${version.javadoc}/docs/api</link>
</links>
</configuration>
</plugin>
</plugins>
</build>
在配置插件的时候,对于groupId为org.apache.maven.plugins的插件其实时可以不用配置groupId的,但是配置上看起来更完整一些。
下面来配置一个关于使用第三方插件为javaFX应用打包系统直接可以运行程序的包的配置。
<properties>
<version.maven-assembly-plugin>2.6</version.maven-assembly-plugin>
<version.javafx-maven-plugin>8.4.0</version.javafx-maven-plugin>
</properties>
<build>
<finalName>JavaFXnative</finalName>
<plugins>
<plugin>
<groupId>com.zenjava</groupId>
<artifactId>javafx-maven-plugin</artifactId>
<version>${version.javafx-maven-plugin}</version>
<configuration>
<!-- 启动类 -->
<mainClass>com.zycoo.billing.Main</mainClass>
<!-- 运行文件名 -->
<appName>${project.build.finalName}-${project.version}</appName>
<!-- 图标的位置 -->
<deployDir>${basedir}/src/deploy</deployDir>
<!-- 菜单 -->
<needMenu>true</needMenu>
<!-- 桌面图标 -->
<needShortcut>true</needShortcut>
<!-- 公司名称 -->
<vendor>zycoo</vendor>
</configuration>
</plugin>
</plugins>
</build>
插件的github地址和官方文档说明请看这里。
4、打包和本地安装
关于打包,很简单,在项目上面右键-run as-maven build/maven install等等,只不过build的时候一般会叫你输入运行的命令,一般情况下都填写“clean package”,这相当于直接在命令行运行“mvn clean package”。
对于上面的javaFX打包,因为本身需要执行“mvn clean jfx:native”所以需要输入“clean jfx:native”.
5、配置父模块
类似于面向对象中的父类,maven支持本pom.xml继承于某一packaging类型为pom的模块,以便于实现配置的集中管理。
各大开源项目都使用了这种方式进行配置。
配置使用标签<parent>配置,下面进行举例:
<parent>
<groupId>cn.songxinqiang</groupId>
<artifactId>oss-parent</artifactId>
<version>1.6</version>
</parent>
6、小结
本文虽然对一般的maven项目的配置的各个方面都涉及说明了,但是对于很多具体的、特殊的需求并没有很深入的讲解,毕竟本文只是一篇入门的文章,很多“高级”的用法都还需要慢慢在实际使用中进行摸索。后续会继续推出maven使用的文章,届时会专注于某一个小的方面的问题进行讲述,那就会详细得多。
本文涉及的很多通用的配置,我都作为开源项目托管到git上面了,请参看下面的地址:
https://git.oschina.net/songxinqiang/OSSParent
https://git.oschina.net/songxinqiang/SSMVParent
同时也发布到了maven中央仓库,你如果想使用的话,直接配置<parent>标签即可:
<parent>
<groupId>cn.songxinqiang</groupId>
<artifactId>oss-parent</artifactId>
<version>1.6</version>
</parent>
<parent>
<groupId>cn.songxinqiang</groupId>
<artifactId>ssmv-parent</artifactId>
<version>1.0.1</version>
</parent>
如有不对的地方,还望指正!!
enjoy!