1. maven概念
maven是一个项目管理工具,能帮助项目规范的构建(规定了项目的结构和方便的打包)以及方便的管理lib下的jar包
如果所有的jar包都放进目录下,那么项目占用空间就会变得很大,通常来说资源文件(图片)> lib(jar) > java代码,很多时候jar包远远大于了java文件(毕竟只是文本),而maven通过本地的一个仓库专门存放jar包,然后不同的项目都从本地仓库中拿jar包,而项目中只需要给出jar包的坐标,就比较合理。
如果在本地仓库(电脑里存放jar包的目录)中找不到jar包,那么会到maven的中央仓库(就是那个maven官方的网站,那里有基本上所有的开源库)找,还找不到就到远程仓库(局域网的服务器)找。
2. maven项目的结构
src/main/java:源代码
src/main/resources:配置文件
src/main/webapp:js,css,web.xml,html,图片等
src/test/java:测试代码(junit)
src/test/resources:测试用的配置和资源文件
3. 使用前的一些配置
注意将bin目录添加入环境变量
conf/settings.xml中将
<localRepository>G:\apache-maven-3.6.0\myLocalRepository</localRepository>
补在对应的标签注释下面
设置下面这个选项后,会先从本地找jar,再到中央仓库找jar
-DarchetypeCatalog=internal
https://www.cnblogs.com/del88/p/6286887.html
或者创建项目的时候
4. 关于scope
比如servlet,由于maven自带servlet,但是写代码的时候我们必须要javax的servlet,否则会报错,因此我们写代码时用javax.servlet,编译时用maven的servlet,所以我们要指定范围
<scope>provided</scope>
代表写代码时生效
5. maven换源
在maven安装目录/conf/settings.xml文件下
<mirrors>
标签下添加如下代码
阿里巴巴源(建议不要整那些花里胡哨的源)
1 2 3 4 5 6
| <mirror> <id>nexus-aliyun</id> <mirrorOf>*</mirrorOf> <name>Nexus aliyun</name> <url>http://maven.aliyun.com/nexus/content/groups/public</url> </mirror>
|
效果如下:(大概140-160行这里,可能有点不同)
6. maven依赖报红线的终极解决办法
这几个按钮依次点几下,就会重新下载了,然后找到报错的那几个dependency剪切再粘贴一遍,包好!!!!
7. maven父子工程
除了maven的包管理(可以在不同的工程下重复使用包),还有maven对代码也实现了可重用,主要体现在同一个项目通常有卖家版买家版,管理员版和普通用户版等等不同的角色版本,这些版本都是针对同一个项目,所以dao层的代码(如findAll, findById)之类的都是查询同样的东西,因此这部分代码可以单独抽离成子工程。
7.1 父子工程使用步骤
- 父工程
其实只需要一个pom.xml,所以new project也好new module也行。然后删掉src目录。作用就是只管理坐标
- 创建子模块
比如我们这里创建dao层,因为不跟页面打交道,所以我们不需要webapp骨架,直接对着父工程new module(注意不是对着idea左上角file->new)
这样一个子模块就创建好了,子模块在自己的pom.xml中添加<parent>标签就可以用父模块的依赖。
1 2 3 4 5
| <parent> <groupId>com.wjw.ssm</groupId> <artifactId>ssm</artifactId> <version>1.0-SNAPSHOT</version> </parent>
|
同样的创建出service层和web层,其中创建web层时需要通过webapp骨架创建,并将自己pom.xml中无用的依赖删掉(packing以下的都可以删掉)
- 关联
service肯定要用dao里面的方法的,那么就在service中的pom.xml中这样添加
1 2 3 4 5
| <dependency> <groupId>com.wjw</groupId> <artifactId>maven_day02_dao</artifactId> <version>1.0-SNAPSHOT</version> </dependency>
|
这个也好理解,其实平时引用的依赖也不过是别人写的代码而已,我们自己的代码当然也可以作为别人的库,只是没有打包成jar而已.
- 原来项目中的resources文件夹下的东西现在如何分配
以ssm项目为例
- log4j.properties属于web模块
- springmvc.xml属于web模块
- applicationContext.xml需要分为3个部分
dao模块:配置连接池,生产SqlSession工厂,扫描接口包路径,下面直接给出dao模块所需applicationContext.xml
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42
| <?xml version="1.0" encoding="UTF-8"?> <beans xmlns="http://www.springframework.org/schema/beans" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:context="http://www.springframework.org/schema/context" xmlns:aop="http://www.springframework.org/schema/aop" xmlns:tx="http://www.springframework.org/schema/tx" xmlns:mvc="http://www.springframework.org/schema/mvc" xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context.xsd http://www.springframework.org/schema/aop http://www.springframework.org/schema/aop/spring-aop.xsd http://www.springframework.org/schema/tx http://www.springframework.org/schema/tx/spring-tx.xsd http://www.springframework.org/schema/mvc http://www.springframework.org/schema/mvc/spring-mvc.xsd">
<bean id="dataSource" class="com.alibaba.druid.pool.DruidDataSource"> <property name="driverClassName" value="com.mysql.cj.jdbc.Driver"/> <property name="url" value="jdbc:mysql:///maven"/> <property name="username" value="root"/> <property name="password" value="0751@@@wjw"/> </bean>
<bean id="sqlSessionFactoryBean" class="org.mybatis.spring.SqlSessionFactoryBean"> <property name="dataSource" ref="dataSource"/> <property name="typeAliasesPackage" value="com.wjw.domain"/> </bean>
<bean class="org.mybatis.spring.mapper.MapperScannerConfigurer"> <property name="basePackage" value="com.wjw.dao"/> </bean>
</beans>
|
service模块:开启注解扫描,aop相关,下面直接给出dao模块所需applicationContext.xml
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47
| <?xml version="1.0" encoding="UTF-8"?> <beans xmlns="http://www.springframework.org/schema/beans" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:context="http://www.springframework.org/schema/context" xmlns:aop="http://www.springframework.org/schema/aop" xmlns:tx="http://www.springframework.org/schema/tx" xmlns:mvc="http://www.springframework.org/schema/mvc" xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context.xsd http://www.springframework.org/schema/aop http://www.springframework.org/schema/aop/spring-aop.xsd http://www.springframework.org/schema/tx http://www.springframework.org/schema/tx/spring-tx.xsd http://www.springframework.org/schema/mvc http://www.springframework.org/schema/mvc/spring-mvc.xsd">
<context:component-scan base-package="com.wjw.service"/>
<bean id="transactionManager" class="org.springframework.jdbc.datasource.DataSourceTransactionManager"> <property name="dataSource" ref="dataSource"/> </bean> <tx:advice id="advice" transaction-manager="transactionManager"> <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> <aop:pointcut id="pt1" expression="execution(* com.wjw.service.impl.*.*(..))"/> <aop:advisor advice-ref="advice" pointcut-ref="pt1"/> </aop:config>
</beans>
|
web模块:只需引用上面两个模块的xml,下面直接给出dao模块所需applicationContext.xml
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21
| <?xml version="1.0" encoding="UTF-8"?> <beans xmlns="http://www.springframework.org/schema/beans" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:context="http://www.springframework.org/schema/context" xmlns:aop="http://www.springframework.org/schema/aop" xmlns:tx="http://www.springframework.org/schema/tx" xmlns:mvc="http://www.springframework.org/schema/mvc" xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context.xsd http://www.springframework.org/schema/aop http://www.springframework.org/schema/aop/spring-aop.xsd http://www.springframework.org/schema/tx http://www.springframework.org/schema/tx/spring-tx.xsd http://www.springframework.org/schema/mvc http://www.springframework.org/schema/mvc/spring-mvc.xsd">
<import resource="classpath:spring/applicationContext-dao.xml" /> <import resource="classpath:spring/applicationContext-service.xml" /> </beans>
|
- 启动
运行父工程的maven自带tomcat
运行web的maven自带tomcat(只有父工程和web工程需要tomcat),但是web工程pom.xml找的是需要打包好的service的jar包,所以我们需要手动打包一下(maven的install就可以打包),直接对parent模块进行install即可
通常我们都是用本地的tomcat的,正常添加就行了,没什么好说的,添加artifact的时候,会发现了只有web模块可以添加。其实就算是上面第一种方式,也是默认路径为web模块
7.2 错误解决
- 无法在web.xml或使用此应用程序部署的jar文件中解析绝对uri:http://java.sun.com/jsp/jstl/core
参考这篇博客
https://blog.csdn.net/weixin_42634260/article/details/89931226?depth_1-utm_source=distribute.pc_relevant.none-task&utm_source=distribute.pc_relevant.none-task
如果还不行,可以在上面的修改的基础上再在web.xml的web-app标签中添加
1 2 3 4 5 6 7 8
| <taglib> <taglib-uri>http://java.sun.com/jsp/jstl/core</taglib-uri> <taglib-location>/WEB-INF/c.tld</taglib-location> </taglib> <taglib> <taglib-uri>http://java.sun.com/jsp/jstl/fmt</taglib-uri> <taglib-location>/WEB-INF/spring-form.tld</taglib-location> </taglib>
|
2.如果报错No tag [formatDate] defined in tag library imported
直接把jsp中的这句删掉吧,少展示一项两项无所谓,jsp的错误实在是没有心情研究,0202年了谁还用这东西
8. maven安装jar包
mvn install:install-file -DgroupId=com.oracle -DartifactId=ojdbc14 -Dversion=10.2.0.1.0 -Dpackaging=jar -Dfile=ojdbc14.jar