maven笔记

maven笔记

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 父子工程使用步骤

  1. 父工程

其实只需要一个pom.xml,所以new project也好new module也行。然后删掉src目录。作用就是只管理坐标

  1. 创建子模块

比如我们这里创建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以下的都可以删掉)

  1. 关联

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而已.

  1. 原来项目中的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">


<!--dao层整合配置开始-->
<!--配置连接池-->
<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>

<!--配置生产SqlSession工厂(因为SqlSession是线程不安全的,所以通过工厂来创建)-->
<bean id="sqlSessionFactoryBean" class="org.mybatis.spring.SqlSessionFactoryBean">
<property name="dataSource" ref="dataSource"/>
<!--扫描pojo包,给包下所有pojo起别名-->
<property name="typeAliasesPackage" value="com.wjw.domain"/>
</bean>

<!--扫描接口包路径,生成包下所有接口的代理对象,并且放入spring容器中-->
<bean class="org.mybatis.spring.mapper.MapperScannerConfigurer">
<property name="basePackage" value="com.wjw.dao"/>
</bean>
<!--dao层整合配置结束-->

</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">


<!--servie层配置文件开始-->
<!--开启注解扫描-->
<context:component-scan base-package="com.wjw.service"/>
<!--通过spring的aop来配置声明式事务控制:
其实就两个事情:1.通知 2.切面
但这里的通知指的是Spring自带的事务管理器,所以要先将这个事务管理器的bean弄出来,再加入通知中-->
<!--配置事务管理器-->
<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>
<!--servie层配置文件结束-->

</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>
  1. 启动
  • 方式一

运行父工程的maven自带tomcat

  • 方式二

运行web的maven自带tomcat(只有父工程和web工程需要tomcat),但是web工程pom.xml找的是需要打包好的service的jar包,所以我们需要手动打包一下(maven的install就可以打包),直接对parent模块进行install即可

  • 方式三(重要,使用本地tomcat)

通常我们都是用本地的tomcat的,正常添加就行了,没什么好说的,添加artifact的时候,会发现了只有web模块可以添加。其实就算是上面第一种方式,也是默认路径为web模块

7.2 错误解决

  1. 无法在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

#
Your browser is out-of-date!

Update your browser to view this website correctly. Update my browser now

×