1、添加jar包依赖的时候。我们之前说可以rebuild index,这样我们就可以搜索本地仓库中的jar包了。但还有一种方式,是当本地没有的时候,我们怎么填写里面的信息。这个时候网络搜索比较靠谱,当然是去指定的网站:mvnrepository。
2、我们在添加jar包的时候,容易引起冲突,但是在引起冲突的时候,maven会帮我们自动解决冲突,除非有时候我们需要自己手动更改。maven帮我们解决冲突的原则有:
——路径优先原则,也就是说如果有一个版本的jar包是直接导入的,另一个版本的jar包是导入其他jar包的时候引入的,那么会以直接导入的为主。
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-beans</artifactId>
<version>4.2.4.RELEASE</version>
</dependency>
——优先声明原则。也就是说不同版本的jar包,如果路径一样,那么谁在pom.xml中写在前面,谁生效。
<dependencies>
<!-- spring-beans-4.2.4 -->
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-context</artifactId>
<version>4.2.4.RELEASE</version>
</dependency>
<!-- spring-beans-3.0.5 -->
<dependency>
<groupId>org.apache.struts</groupId>
<artifactId>struts2-spring-plugin</artifactId>
<version>2.3.24</version>
</dependency>
<dependencies>
——排除原则。也就是说,我排在前面的jar包,我在pom.xml中的该依赖处,添加一个<exclusion>
标签,在里面把我要排除的jar包写进去,这样就不会用这边的,而是用其他地方的jar包。
<dependency>
<groupId>org.apache.struts</groupId>
<artifactId>struts2-spring-plugin</artifactId>
<version>2.3.24</version>
<exclusions>
<exclusion>
<groupId>org.springframework</groupId>
<artifactId>spring-beans</artifactId>
</exclusion>
</exclusions>
</dependency>
——当然,我们有时候会需要锁定jar包的版本,可以在pom.xml中添加<dependencyManagement>
标签,在里面写需要锁定的jar包和版本。再来一个当然,这个版本号可以提取出来作为单独一个变量,这样方便以后修改。看下面的代码,我们锁定了版本之后,在下面的依赖的地方可以直接省略版本的标签。
<!-- 属性 -->
<properties>
<spring.version>4.2.4.RELEASE</spring.version>
<hibernate.version>5.0.7.Final</hibernate.version>
<struts.version>2.3.24</struts.version>
</properties>
<!-- 锁定版本,struts2-2.3.24、spring4.2.4、hibernate5.0.7 -->
<dependencyManagement>
<dependencies>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-context</artifactId>
<version>${spring.version}</version>
</dependency>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-aspects</artifactId>
<version>${spring.version}</version>
</dependency>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-orm</artifactId>
<version>${spring.version}</version>
</dependency>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-test</artifactId>
<version>${spring.version}</version>
</dependency>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-web</artifactId>
<version>${spring.version}</version>
</dependency>
<dependency>
<groupId>org.hibernate</groupId>
<artifactId>hibernate-core</artifactId>
<version>${hibernate.version}</version>
</dependency>
<dependency>
<groupId>org.apache.struts</groupId>
<artifactId>struts2-core</artifactId>
<version>${struts.version}</version>
</dependency>
<dependency>
<groupId>org.apache.struts</groupId>
<artifactId>struts2-spring-plugin</artifactId>
<version>${struts.version}</version>
</dependency>
</dependencies>
</dependencyManagement>
<!-- 依赖管理 -->
<dependencies>
<!-- spring -->
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-context</artifactId>
</dependency>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-aspects</artifactId>
</dependency>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-orm</artifactId>
</dependency>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-test</artifactId>
</dependency>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-web</artifactId>
</dependency>
<!-- hibernate -->
<dependency>
<groupId>org.hibernate</groupId>
<artifactId>hibernate-core</artifactId>
</dependency>
<!-- 数据库驱动 -->
<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
<version>5.1.6</version>
<scope>runtime</scope>
</dependency>
<!-- c3p0 -->
<dependency>
<groupId>c3p0</groupId>
<artifactId>c3p0</artifactId>
<version>0.9.1.2</version>
</dependency>
<!-- 导入 struts2 -->
<dependency>
<groupId>org.apache.struts</groupId>
<artifactId>struts2-core</artifactId>
</dependency>
<dependency>
<groupId>org.apache.struts</groupId>
<artifactId>struts2-spring-plugin</artifactId>
</dependency>
<!-- servlet jsp -->
<dependency>
<groupId>javax.servlet</groupId>
<artifactId>servlet-api</artifactId>
<version>2.5</version>
<scope>provided</scope>
</dependency>
<dependency>
<groupId>javax.servlet</groupId>
<artifactId>jsp-api</artifactId>
<version>2.0</version>
<scope>provided</scope>
</dependency>
<!-- 日志 -->
<dependency>
<groupId>org.slf4j</groupId>
<artifactId>slf4j-log4j12</artifactId>
<version>1.7.2</version>
</dependency>
<!-- junit -->
<dependency>
<groupId>junit</groupId>
<artifactId>junit</artifactId>
<version>4.9</version>
<scope>test</scope>
</dependency>
<!-- jstl -->
<dependency>
<groupId>javax.servlet</groupId>
<artifactId>jstl</artifactId>
<version>1.2</version>
</dependency>
</dependencies>
<build>
<plugins>
<!-- 设置编译版本为1.7 -->
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-compiler-plugin</artifactId>
<configuration>
<source>1.7</source>
<target>1.7</target>
<encoding>UTF-8</encoding>
</configuration>
</plugin>
<!-- maven内置 的tomcat6插件 -->
<plugin>
<groupId>org.codehaus.mojo</groupId>
<artifactId>tomcat-maven-plugin</artifactId>
<version>1.1</version>
<configuration>
<!-- 可以灵活配置工程路径 -->
<path>/ssh</path>
<!-- 可以灵活配置端口号 -->
<port>8080</port>
</configuration>
</plugin>
</plugins>
</build>
3、配置ssh框架。直接在网上搜索“ssh pom”或者“ssm pom”等,就可以直接找到对应的pom.xml,然后修改成自己需要的版本即可。复制过来,还需要注意的是tomcat plugin那边,注意看看里面的path是不是自己的项目名称,以及port端口。
4、我们在配置Hibernate配置文件的时候,对应的实体类的.xml文件也要放在resources里面。这个时候不能直接把Customer.hbm.xml放在resources下面,以为我们最终还是要让它和Customer.java放在一起的。所以,我们就需要把cn.itcast.crm.entity这个文件夹整个拷贝到resources下面,这样他们在编译以后再classes中就会放在一起。
5、maven分层的项目结构。
——我们需要先创建一个父工程,这个时候,选择的形式是pom。我们需要把子工程用到的jar包都放在父工程的pom.xml中。
——然后右击父工程,新建,这个时候需要注意的是新建的不是maven project了,而是maven module了。一般分成entity、dao、service等。需要注意的是,创建的子工程,需要打成jar。创建好之后,我们可以在父工程的pom.xml中查看到module标签,以及子工程中的parent标签,这就是他们父子之间关系的联系。
——可以看到子工程的pom.xml中并没有写依赖jar包,但是maven dependencies中有很多jar包,就是因为这个都在父工程中写了。
——我们在创建service子工程的时候,需要依赖dao项目,所以我们需要把dao项目发布到本地仓库,并在service项目的pom.xml中添加dao的依赖,其实就类似于引入一个普通的jar包。
——一般我们在创建parent和dao之后,就直接发布install父工程,这个时候因为dao已经和父工程联系在一起了,所以也会一并发布dao。发布之后我们就可以在service中引入了。
——传递依赖中依赖范围的影响。比如service依赖dao,dao里面有junit包,但是junit包的scope是test,导致service没有引入junit。这就是说junit的依赖范围scope会影响传递依赖。
那怎么解决呢?既然没有传递过来,那我们直接在service的pom.xml中把依赖的jar包添加进来即可。我们争取不要修改junit的scope。
——我们创建的web子工程和dao、service不同的是,需要选择war的打包形式。它需要用到service,那么就把service打包发布,然后引用即可。
——虽然dao、service等里面都有maven dependencies,但是运行打包的时候只是运行web,所以只会把web子工程里的maven dependencies里的jar包进行打到war包里。
6、如果像上面那样分成dao、service、web的话,然后给不同团队和人去维护,那么我在本地对dao或者service打包之后,web的团队怎么获取到呢?难不成qq传一下么?这里就需要用到私服的概念,大概意思就是打包之后是导私服中的,然后web团队直接从私服获取。
——私服的搭建是用nexus软件。下载解压之后,里面有个bin,里面有个nexus.bat命令,直接在cmd中进行nexus.bat install
即可安装成功。然后启动这个服务的话,可以用nexus start
即可。这里面我们可以看到nexus解压之后的目录中有一个properties文件,里面有路径和端口的配置信息,用于访问的,因为nexus可以理解成是一个bs架构。
——我们可以访问localhost:8081/nexus
,之后打开欢迎页面,这个是需要登录的。默认的账号密码时admin
和admin123
,登陆进去之后,点击左边菜单Repositories。
——我们看到这里面有很多仓库并且有不同的类型。我们一般需要用的是group类型的仓库,这个仓库可以自动帮我们去不同的仓库中查找,哪里查到就用哪个仓库里的,查找顺序见下面:
7、我们下面的任务就是,怎样把我们的项目打成jar包发到私服上面,比如dao子工程?
——第一步,就是先配置maven的settings.xml文件,在这里面配置的是账号密码,也就是访问私服的账号和密码。
<server>
<id>releases</id>
<username>admin</username>
<password>admin123</password>
</server>
<server>
<id>snapshots</id>
<username>admin</username>
<password>admin123</password>
</server>
——第二步,在需要发布的项目的pom.xml配置,配置发布路径。下面的意思是如果这个项目是SNAPSHOTS的话就发布到snapshots对应的目录下,如果是RELEASES版本的话就发布到releases目录下,这里面有对应的url地址,这个就是私服的地址。
<distributionManagement>
<repository>
<id>releases</id>
<url>http://localhost:8081/nexus/content/repositories/releases/</url>
</repository>
<snapshotRepository>
<id>snapshots</id>
<url>http://localhost:8081/nexus/content/repositories/snapshots/</url>
</snapshotRepository>
</distributionManagement>
——至于说上面的id标签哪里来的,不是简单的小写那么简单,是私服中定义好的:
——最后用maven的deploy命令发布即可。
——使用私服的时候,需要先配置下载地址,在maven的settings.xml中的profiles标签中配置,我们配置的其实就是一个下载地址,这个地址就是私服地址,当然,我们配置的是group的,这样就只需要配置一个,不然releases和snapshots的等等都要配置。
<profile>
<!--profile的id-->
<id>dev</id>
<repositories>
<repository>
<!--仓库id,repositories可以配置多个仓库,保证id不重复-->
<id>nexus</id>
<!--仓库地址,即nexus仓库组的地址-->
<url>http://localhost:8081/nexus/content/groups/public/</url>
<!--是否下载releases构件-->
<releases>
<enabled>true</enabled>
</releases>
<!--是否下载snapshots构件-->
<snapshots>
<enabled>true</enabled>
</snapshots>
</repository>
</repositories>
<pluginRepositories>
<!-- 插件仓库,maven的运行依赖插件,也需要从私服下载插件 -->
<pluginRepository>
<!-- 插件仓库的id不允许重复,如果重复后边配置会覆盖前边 -->
<id>public</id>
<name>Public Repositories</name>
<url>http://localhost:8081/nexus/content/groups/public/</url>
</pluginRepository>
</pluginRepositories>
</profile>
——配置的profiles需要激活,也就是在settings.xml中添加下面这个代码:
<activeProfiles>
<activeProfile>dev</activeProfile>
</activeProfiles>
——最后,对引用的service或者其他工程进行一个maven-update project即可,这样就会在私服上把这个jar包下载到本地仓库,并且导入项目中。我们可以看Console控制台,可以发现有 downloading 从哪个网址下载jar包,也就是从我们的私服上下载的。
8、最后一个提示,就是如果dao里面有改动,怎么办?需要把dao里面的pom.xml的version改成0.0.2-SNAPSHOTS之类的,然后deploy到私服,并且通知service团队,在service的pom.xml中把引用dao的地方的版本改成0.0.2,这样就能正常运转了。