maven工程解决jar包冲突解决
第一种解决方案
- 第一声明优先原则
- 哪个jar包在坐标靠上的位置,这个jar包就是先声明的,先声明的jar包坐标下的依赖包,可以优先进入项目中
第二种解决方案
- 路径近者优先原则
- 直接依赖路径比传递依赖路径近,最终项目中进入的jar包会是路径近的直接依赖包
- 直接依赖:项目中直接导入的jar包,就是项目的直接依赖包
- 传递依赖:项目中没有直接导入的jar包,可以通过项目直接依赖jar包传递到项目中
第三种解决方案
- 直接排除法
- 我们要排除某个jar包下依赖包的时候,在配置
exclution
标签的时候,内部可以不写版本号,因为此时依赖包使用的版本和默认jar包一样
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-beans</artifactId>
<version>4.2.4 RELEASE</version>
<exclusions>
<exclution>
<groupId>org.springframework</groupId>
<artifactId>spring-core</artifactId>
</exclution>
</exclusions>
</dependency>
maven传统web工程做一个数据查询操作
- 就是一个ssm的查询数据库操作,具体代码省略,重点配置如下
- 使用一个新的数据源:
Druid
<bean id="dataSource" class="com.alibaba.druid.pool.DruidDataSource">
<property name="driverClassName" value="com.mysql.jdbc.Driver"/>
<property name="url" value="jdbc:mysql:///maven"/>
<property name="username" value="root"/>
<property name="password" value="root"/>
</bean>
- 配置生产SqlSession对象的工厂
<bean id="sqlSessionFactory" class="org.mybatis.spring.SqlSessionFactoryBean">
<property name="dataSource" ref="dataSource"/>
<property name="typeAliasesPackage" value="com.my.domain"/>
</bean>
- 配置扫描接口包路径,生成包下所有接口的代理对象并且放入spring容器中
<bean class="org.mybatis.spring.mapper.MapperScannerConfigurer">
<property name="basePackage" value="com.my.dao"/>>
</bean>
- 配置service层组件扫描配置
<context:component-scan base-package:"com.itheima.service">
- 配置事务aop
<bean id="transactionManager" class="org.springframework.jdbc.datasource.DataSourceTransactionManager">
<property name="dataSource" ref="dataSource"/>
</bean>
<tx:advice id="advice">
<tx:attributes>
<tx:method name="save*" propagation="REQUIRED"/>
<tx:method name="update*" propagation="REQUIRED"/>
<tx:method name="delete*" propagation="REQUIRED"/>
<tx:method name="find*" read-only="true"/>
<tx:method name="*" propagation="REQUIRED"/>
</tx:attributes>
</tx:advice>
<aop:config>
<sop:pointcut id="pointcut" expression="execution(* com.my.service.impl.*.*(..))"/>
<aop:advisor advice-ref="advice" pointcut-ref="pointcut"/>
</aop:config>
- springmvc.xml配置
<context:component-scan base-package="com.my.controller"/>
<mvc:annotation-driven/>
<bean id="internalResourceViewResolver" class="org.springframework.web.servlet.view.InternalResource">
<property name="prefix" value="WEB-INF/pages/"/>
<property name="suffix" value=".jsp"/>
</bean>
<mvc:default-servlet-handler>
- 配置spring核心监听器
<listener>
<listener-class>org.springframework.web.context.ContextLoaderListener</listener-class>
</listener>
<context-param>
<param-name>contextConfigLocation</param-name>
<param-value>classpath:applicationContext.xml</param-value>
</context-param>
- 配置springmvc的核心servlet
<servlet>
<servlet-name>springmvc</servlet-name>
<servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
<init-param>
<param-name>contextConfigLocation</param-name>
<param-value>classpath:springmvc.xml</param-value>
</init-param>
<load-on-startup>1</load-on-startup>
</servlet>
<servlet-mapping>
<servlet-name>springmvc</servlet-name>
<url-pattern>/</url-pattern>
</servlet-mapping>
把web工程修改成maven拆分与聚合的形式
maven工程拆分与聚合的思想
- 一个项目拆成不同模块,不同模块组合成一个项目
- 比方说传统的ssm框架整合项目,在每个项目中中放置一套ssm框架jar包,如果是maven的ssm,就只需要一套jar包,真正的项目中只需要放置jar包坐标
- 在比方说公司开发新项目,我们首先要考虑的问题是dao,service,utils,domain这些模块是否已经存在,如果存在直接引用坐标即可,而不是copy。如果需要维护,也只需要修改一份代码
- maven把一个完整的项目,分成不同的独立模块,这些模块都有各自独立的坐标,哪个地方需要其中某个模块,就直接引用该模块的坐标即可。这就是maven拆分的思想
- 把拆分零散的模块聚合到一起编写一个完整的项目,就是maven聚合的思想
工程和模块,依赖和继承的关系
- 工程和模块的区别
- 工程天生只能使用自己内部资源,工程天生是独立的,后天可以和其他工程或模块建立关联关系
- 模块天生不是独立的,模块天生是属于父工程的,模块一旦创建,所有父工程的资源都可以使用
- 工程不等于完整的项目,模块也不等于完整的项目,一个完整的项目看的是代码,代码完整,就可以说这是一个完整的项目,和此项目是工程和模块没有关系
- 父子工程之间,子模块天生继承父工程,可以使用父工程所有的资源,子模块之间天生是没有任何关系的
- 父子工程之间不用建立关系,继承关系是先天的,不需要手动建立
- 平级之间的引用叫依赖,依赖不是先天的,是需要后天依赖的
依赖丢失问题
- 实际开发中,如果传递依赖丢失,表现形式就是jar包的坐标导不进去,解决方法就是再导入一次即可
![(img-slExcWHO-1572415522221)(./images/依赖丢失.png)]](https://i-blog.csdnimg.cn/blog_migrate/fadcd3a2032cae300034912aca95191c.png)
maven私服(远程仓库)
安装并且登录
- 下载安装压缩包,解压到没有中文路径的文件夹下
- 进入bin目录,打开控制台
- 安装/卸载/启动:nexus.bat install / uninstall / start
- 配置文件在conf文件夹下nexus.properties
- 访问http://localhost:8081/nexus/
- 账号
admin
,密码admin123
上传jar包到私服
<server>
<id>releases</id>
<username>admin</username>
<password>admin123</password>
</server>
<server>
<id>snapshots</id>
<password>admin123</password>
</server>
<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>
下载jar包从私服(配置到settings.xml的profiles标签中)
<profile>
<id>dev</id>
<repositories>
<repository>
<id>nexus</id>
<url>http://localhost:8081/nexus/content/groups/public/</url>
<releases>
<enabled>true</enabled>
</releases>
<snapshots>
<enabled>true</enabled>
</snapshots>
</repository>
</repositories>
<pluginRepositories>
<pluginRepository>
<id>public</id>
<name>Public Repositories</name>
<url>http://localhost:8081/nexus/content/groups/public/</url>
</pluginRepository>
</pluginRepositories>
</profile>
<activeProfiles>
<activeProfile>dev</activeProfile>
</activeProfiles>
如何安装第三方jar包(安装到本地仓库,安装到私服)
安装第三方jar包到本地仓库
- 进入jar包所在目录运行
mvn install:install-file -DgroupId=com.alibaba -DartifactId=fastjson -Dversion=1.1.37 -Dfile=fastjson-1.1.37.jar -Dpackaging=jar
- 打开cmd直接运行
mvn install:install-file -DgroupId=com.alibaba -DartifactId=fastjson -Dversion=1.1.37 -Dpackaging=jar -Dfile=C:\my_java\安装第三方jar包\fastjson-1.1.37.jar
安装第三方jar包到私服