maven 原型工程
第一篇中,主要是简单的介绍了一下maven,这一篇主要是围绕maven常用到的点进行,再就是用maven和eclipse来进行开发maven项目。
先从第一篇中的生成maven工程的那行maven命令说起:
mvn archetype:generate \
-DarchetypeGroupId=org.apache.maven.archetypes \
-DgroupId=com.maven.app \
-DartifactId=myapp
我把它生成的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/maven-v4_0_0.xsd">
<modelVersion>4.0.0</modelVersion>
<groupId>com.maven.app</groupId>
<artifactId>myapp</artifactId>
<packaging>jar</packaging>
<version>1.0-SNAPSHOT</version>
<name>myapp</name>
<url>http://maven.apache.org</url>
<dependencies>
<dependency>
<groupId>junit</groupId>
<artifactId>junit</artifactId>
<version>3.8.1</version>
<scope>test</scope>
</dependency>
</dependencies>
</project>
validate
generate-sources
process-sources
generate-resources
process-resources
compile
pom.xml包含了这个工程的POM,即project object model,maven工程一切都是以project为单元进行工作的,pom.xml正是包含了这个工程的重要信息,这个pom.xml是最简单的POM,它包含了一个POM关键的的几个元素:project -----pom.xml的最顶层元素
modelVersion -------------------指示我们当前使用的POM的版本,一般不会变,如果有必要时才会改变
groupId----------------------------指组织的唯一标识,一般组织的简称什么的,是关键的元素,在我们生成工程的命令里可以看到,这个ID是我们自己取的,为的就是标识开发组织
artifactId-------------------标识我们工程的名字,将来会用到发行的包的最终名字的一部分,命令里我们给出的是"myapp"
packaging--------------说明要打包成什么类型的文件,有jar、war、ear等.
version-----------------版本的意思是由工程自动生成管理的,我们会看到SNAPSHOT的字样的时候,表示这个工程正在开发中
name---------------------表明工程要显示时用到的名字,在maven 生成文档的时候会用到
url-------------------------表明我们工程所在的site,生成文档时用
description-------------------工程的简要描述。
编译工程
mvn test-compile
在对测试类进行单元测试的时候,maven也会下载一些相关的资源。
安装、文档
我们用mvn package 将工程打包之后,用mvn install就可以将打包的jar 包安装到本地的maven资源库中去,这样别人就可以pom.xml里进行配置后作用。mvn idea和mvn eclipse
mvn idea:idea 或者mvn eclipse:eclipse
这样就将工程转换成,我们可以将maven工程导入到eclipse里时行开发。
maven使用插件
<!-- jetty插件 -->
<build>
<plugins>
<plugin>
<groupId>org.mortbay.jetty</groupId>
<artifactId>jetty-maven-plugin</artifactId>
<configuration>
<scanIntervalSeconds>10</scanIntervalSeconds>
<webApp>
<contextPath>/spsh</contextPath>
</webApp>
</configuration>
</plugin>
</plugins>
<finalName>spsh</finalName>
</build>
如代码中,plugin就是放置插件的地方,它们都放在build下边的plugins里,这样maven就会自动的对jetty进行管理了。
资源依赖
<dependencies>...</dependencies>
<!-- spring4.1.4 -->
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-context</artifactId>
<version>3.1.4.RELEASE</version>
</dependency>
有的时候我们所依赖的jar包并不在本地,这个时候maven就会从远程的maven仓库进行下载:
http://repo.maven.apache.org/maven2/
,这个远程仓库的地址你也可以自己设置自己的仓库,在所有的依赖写完之后,maven会自动下载这些依赖jar所需要的其它的jar,不用我们手动解决了,可以说真的是大大的方便了我们的开发。
管理多个工程
maven可以同时管理多个工程,我们只需要加入一个父类的pom.xml,如我们有两个工程:project1,project2,每个工程里肯定有一个pom.xml吧,这样,我们在project1和project2同级的文件夹内建立这个父级别的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.maventest.app</groupId>
<artifactId>app</artifactId>
<version>1.0-SNAPSHOT</version>
<packaging>pom</packaging>
<modules>
<module>project1</module>
<module>project2</module>
</modules>
</project>
然后在分别在project1和project2中的pom.xml文件里加上:
<parent>
<groupId>com.mycompany.app</groupId>
<artifactId>app</artifactId>
<version>1.0-SNAPSHOT</version>
</parent>
Eclipse中使用maven 插件工程
mvn 固定非常强大,可是直接拿来一个记事本来进行工程开发,写起代码来也不是那么的顺畅,eclipse 作为我们常的开发的IDE,当然很好的和maven结合在一起,不用不知道,用过才明白,原来,真的很值得用。加入依赖
加入依赖
<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/maven-v4_0_0.xsd">
<modelVersion>4.0.0</modelVersion>
<groupId>com.spring.ts</groupId>
<artifactId>spsh</artifactId>
<packaging>war</packaging>
<version>0.0.1-SNAPSHOT</version>
<name>spsh Maven Webapp</name>
<url>http://maven.apache.org</url>
<dependencies>
<dependency>
<groupId>junit</groupId>
<artifactId>junit</artifactId>
<version>3.8.1</version>
<scope>test</scope>
</dependency>
<!-- spring4.1.4 -->
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-context</artifactId>
<version>3.1.4.RELEASE</version>
</dependency>
<!-- 运行spring需要的cglib -->
<dependency>
<groupId>cglib</groupId>
<artifactId>cglib</artifactId>
<version>2.2.2</version>
</dependency>
<!-- asm工具类 -->
<dependency>
<groupId>asm</groupId>
<artifactId>asm-util</artifactId>
<version>2.1</version>
</dependency>
</dependencies>
<!-- jetty插件 -->
<build>
<plugins>
<plugin>
<groupId>org.mortbay.jetty</groupId>
<artifactId>jetty-maven-plugin</artifactId>
<configuration>
<scanIntervalSeconds>10</scanIntervalSeconds>
<webApp>
<contextPath>/spsh</contextPath>
</webApp>
</configuration>
</plugin>
</plugins>
<finalName>spsh</finalName>
</build>
</project>
代码测试
package hello;
public interface MessageService {
String getMessage();
}
package hello;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Component;
@Component
public class MessagePrinter {
@Autowired
private MessageService service;
public void printMessage() {
System.out.println(this.service.getMessage());
}
}
package hello;
import org.springframework.context.ApplicationContext;
import org.springframework.context.annotation.AnnotationConfigApplicationContext;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.ComponentScan;
import org.springframework.context.annotation.Configuration;
@Configuration
@ComponentScan(basePackages="hello")
public class Application {
public @Bean MessageService mockMessageService(){
return new MessageService() {
public String getMessage() {
return "hello world!";
}
};
}
public static void main(String[] args) {
ApplicationContext context = new AnnotationConfigApplicationContext(Application.class);
MessagePrinter printer = context.getBean(MessagePrinter.class);
printer.printMessage();
}
}
在Application.java里进行测试,这个类是基于java配置的类,用于代替xml文件,@Bean一般与@Configuration联用,来对方法进行注解,好返回一个实体,其实也类似于xml中的<bean/>定义了,@ComponenScan须要加上至少一个包名,说明要在这个包和子包下边扫描所有@Component注解的类,说明一下, @Controllery就是另一种形式的@Component。