【JavaWeb-29】Maven依赖冲突、配置ssh框架、搭建maven私服、发包到私服

来源:互联网 发布:数据库如何实时备份 编辑:程序博客网 时间:2024/06/08 13:26

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,之后打开欢迎页面,这个是需要登录的。默认的账号密码时adminadmin123,登陆进去之后,点击左边菜单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,这样就能正常运转了。

原创粉丝点击