之前在一个公司接触了一个项目,框架师用到了maven,作为一个小公司的码农,新事物总是令人神往,恰值周末,在iteye看到一篇文章。个人惯例,原作者博客地址:http://jackycheng2007.iteye.com/
本文是接着前面的一片继续记录maven的学习笔记:
法宝2. POM 项目对象模型 - 继续
Project Inheritance - 项目继承
前面说到了项目在maven里被看成是object,既然如此,肯定有继承的功能。这个功能很有用,等于是让我们的项目profile也能被重用。试想,如果你有很多相似的项目,比如采用ssh开发的一系列项目,你的每个项目的pom里面肯定有不少重复的部分。有了继承,你就可以把这些公用的部分都抽取出来,然后每个子项目再继承,从而达到重用的目的。本来嘛,继承就是反应了is-a的关系,一个supper项目下面的子项目天生就和supper项目有is-a的关系吧。这样也不算滥用继承了,哈哈。
怎么继承呢?
接着上篇文章的最后一个例子,如果他下面有个子模块需要继承它的话:
- <project>
- <parent>
- <groupId>com.mycompany.app</groupId>
- <artifactId>my-app</artifactId>
- <version>1</version>
- </parent>
- <modelVersion>4.0.0</modelVersion>
- <artifactId>my-module</artifactId>
- </project>
这个子模块就继承了父模块的groupid和version等信息。等一下,这里有个问题。就凭
<groupId>com.mycompany.app</groupId>,子模块怎么找到supper的pom啊?
是的,如果supper项目已经安装在local的repository里面了或者supper的pom在约定的目录,也就是子模块的上一级目录(如下),就可以。
my-app|-- my-module
| `-- pom.xml
`-- pom.xml
那么,如果不巧,这两条都不是呢?比如:
.
|-- my-module
| `-- pom.xml
`-- parent
`-- pom.xml
那我们还可以自己指定位置:
- <project>
- <parent>
- <groupId>com.mycompany.app</groupId>
- <artifactId>my-app</artifactId>
- <version>1</version>
- <relativePath>.../parent/pom.xml</relativePath>
- </parent>
- <modelVersion>4.0.0</modelVersion>
- <artifactId>my-module</artifactId>
- </project>
Project Aggregation - 项目集合
通过项目继承,我们再管理或者构建子项目的时候就能从用parent项目的pom。反过来呢?如果我们要构建一个完整的项目,是不是经常需要集合多个子项目来打包呢。Project Aggregation就是解决这个问题的。
怎么做呢?得满足两点:
父项目的pom里面的packaging的值设为 "pom" .
在父项目的pom里面自定子项目的目录
如果我们想把my-module集合到my-app里面,做如下的修改:
- <project>
- <modelVersion>4.0.0</modelVersion>
- <groupId>com.mycompany.app</groupId>
- <artifactId>my-app</artifactId>
- <version>1</version>
- <packaging>pom</packaging>
- <modules>
- <module>my-module</module>
- </modules>
- </project>
上面,没有写路径,也是因为如果遵循maven的目录约定。如果不是那就得写:
- <project>
- <modelVersion>4.0.0</modelVersion>
- <groupId>com.mycompany.app</groupId>
- <artifactId>my-app</artifactId>
- <version>1</version>
- <packaging>pom</packaging>
- <modules>
- <module>../my-module</module>
- </modules>
- </project>
可见,约定是一种很好的方式,可以节省代码,也容易形成共识。
Project Interpolation and Variables - 使用变量
有可能在pom里面你会在多处用到同一个字符串片段,比如路径。meven支持变量的声明和引用,这样你就可以防止hard code了。
怎么引用变量?看看下面:
- <version>${project.version}</version>
$符号加上大括号,用点来分级访问。很方便。如果有继承关系,会采用子类的值。
有哪些可用的变量呢?
Project Model Variables
pom里面的任何单值元素都可以被当做变量来引用,比如:
${project.groupId}, ${project.version}, ${project.build.sourceDirectory}
Special Variables
${basedir}, 当前项目所在目录
${project.baseUri}, 当前项目所在目录URI. Since Maven 2.1.0
${maven.build.timestamp}, 项目build的开始时间. Since Maven 2.1.0-M1
Properties
你也可以把pom里面定义的Properties当成变量来引用。
- <project>
- ...
- <properties>
- <mavenVersion>2.1</mavenVersion>
- </properties>
- <dependencies>
- <dependency>
- <groupId>org.apache.maven</groupId>
- <artifactId>maven-artifact</artifactId>
- <version>${mavenVersion}</version>
- </dependency>
- <dependency>
- <groupId>org.apache.maven</groupId>
- <artifactId>maven-project</artifactId>
- <version>${mavenVersion}</version>
- </dependency>
- </dependencies>
- ...
- </project>
通过Properties,你就可以自定义一些变量了,哈哈。
相关推荐
2. **正则表达式**:在`<from>`和`<to>`中使用正则表达式,实现更复杂的URL匹配和替换。 3. **自定义变量**:通过`<set>`标签设置和引用变量,增加规则的灵活性。 4. **Session和Cookie管理**:可以对Session和...
<artifactId>maven-fop-plugin</artifactId> <version>2.6</version> <configuration> <!-- 配置文件路径等 --> </configuration> </plugin> </plugins> </build> ``` 3. **Maven Reports Plugin**: Maven ...
下面将详细介绍如何使用Maven和第三方插件将Java程序转换为可执行的exe文件。 1. **Maven配置** Maven项目通常由`pom.xml`文件进行配置。在该文件中,我们需要添加用于创建可执行文件的插件。一个常用的插件是`...
要将`List<Object>`转换为JSON,首先确保你的`Object`类已经正确实现了`Serializable`接口,这样Jackson才能正确地序列化它。然后,你可以使用`ObjectMapper`类来完成转换。下面是一个示例代码: ```java import ...
-- <artifactId>dbunit-database-mysql</artifactId> --> <!-- </dependency> --> <!-- oracle dbunit datatype --> <dependency> <groupId>org.dbunit</groupId> <artifactId>dbunit-database-oracle</...
<groupId>org.apache.tomcat.maven</groupId> <artifactId>tomcat7-maven-plugin</artifactId> <configuration> <port>8080</port> <path>/</path> </configuration> </plugin> </plugins> </build> ``` ...
Maven通过一个叫做pom.xml的项目对象模型文件来配置项目构建的各个方面,其中<build>标签是Maven构建配置的核心部分,它定义了整个构建生命周期中需要执行的指令和任务。 Maven构建包括编译代码、执行测试、打包...
<groupId>org.apache.maven.plugins</groupId> <artifactId>maven-jar-plugin</artifactId> <version>3.2.0</version> <configuration> <archive> <manifest> <addClasspath>true</addClasspath> ...
要实现在Maven项目中使用ProGuard,我们需要以下步骤: 1. 添加ProGuard依赖:在项目的`pom.xml`文件中,我们需要添加ProGuard Maven插件。通常,我们会使用`maven-shade-plugin`来结合ProGuard工作,因为它可以...
<groupId>org.apache.maven.plugins</groupId> <artifactId>maven-eclipse-plugin</artifactId> <version>2.9</version> <configuration> <wtpversion>2.0</wtpversion> <!-- 根据你的Eclipse版本选择合适的WTP...
<version>2.x.x.RELEASE</version> <executions> <execution> <goals> <goal>repackage</goal> </goals> </execution> </executions> </plugin> <plugin> <groupId>org.apache.maven.plugins</groupId> ...
然而,一个普通的Maven工程通常只是一个Java应用程序,若要将其转化为Web工程,我们需要添加Web相关的配置和依赖,以便它可以部署到Web服务器上运行。本文将详细介绍如何将普通Maven工程转变为Web工程。 1. **理解...
- `<packaging>`:指定项目的打包方式,这里为`war`,表示这是一个Web应用程序。 - `<name>`:项目名称。 #### 属性配置 ```xml <properties> <spring.version>3.0.5.RELEASE</spring.version> <log4j.version>...
<artifactId>protoc-maven-plugin</artifactId> <version>3.x.y</version> <configuration> <protocVersion>${protobuf.version}</protocVersion> <inputDirectories> <include>src/main/proto</include> </...
POM文件的基本结构应包含`<project>`标签,内部包括`<modelVersion>`、`<groupId>`、`<artifactId>`和`<version>`等关键元素。`groupId`代表项目组织的唯一标识,`artifactId`是模块的唯一标识,`version`是模块的...
2. **boot**:这个目录包含用于启动Maven的类加载器,如`plexus-classworlds-2.x.jar`。 3. **conf**:配置文件目录,其中最重要的是`settings.xml`,它是Maven的全局配置文件,可以设置本地仓库路径、远程仓库和...
3. **配置Maven**: 要让Maven使用这个自定义catalog,你需要在`.m2`目录下的`settings.xml`文件中添加一个`archetypeCatalog`元素。例如: ```xml <settings> ... <profiles> <profile> <id>custom-archetypes</...
2. **使用maven-assembly-plugin**: 这个插件可以创建自定义的归档文件,包括RAR格式。在`pom.xml`中添加以下配置: ```xml <build> <plugins> <plugin> <artifactId>maven-assembly-plugin</artifactId> ...
使用SnuggleTeX将LaTeX方程式转换为MathML的Maven Mojo 原始的html文件假定位于./help-gen 。 具有转换文件的目录被复制到./target/latex2mathml 。 <plugin> <groupId>no.marintek.sima</groupId> <artifactId...
2. **代理设置**:如果你在使用代理访问互联网,需要在`<proxies>`标签内配置: ```xml <proxies> <proxy> <id>example-proxy</id> <active>true</active> <protocol>http</protocol> <host>your-proxy-host...