①. Maven的依赖范围
- ①. maven的依赖范围包括:compile、provide、runtime、test、system
compile:编译范围的依赖会用在编译,测试,运行,由于运行时需要,所以编译范围的依赖会被打包(会被打包)
test:test范围依赖在编译和运行时都不需要,只在测试编译和测试运行时需要。例如:Junit。由于运行时不需要,所以test范围依赖不会被打包(不会打包)
provide:provide依赖只有当jdk或者一个容器已提供该依赖之后才使用。provide依赖在编译和测试时需要,在运行时不需要。例如:servletapi被Tomcat容器提供了(不会打包)
runtime:runtime依赖在运行和测试系统时需要,但在编译时不需要。例如:jdbc的驱动包。
由于运行时需要,所以runtime范围的依赖会被打包(会打包)
system:system范围依赖与provide类似,但是必须显示的提供一个对于本地系统中jar文件的路径。一般不推荐使用
②. 图解
③. 代码中展示:
<!--导入mysql驱动--> <dependency> <groupId>mysql</groupId> <artifactId>mysql-connector-java</artifactId> <!--runtime表示编译器不使用它,运行期使用它--> <scope>runtime</scope> <version>8.0.17</version> </dependency> <!--导入servlet相关依赖,request不报错--> <dependency> <groupId>javax.servlet</groupId> <artifactId>servlet-api</artifactId> <version>2.5</version> <!--provided的意思是编译时使用它,运行时不使用--> <scope>provided</scope> </dependency> <--jsp--> <dependency> <groupId>javax.servlet.jsp</groupId> <artifactId>jsp-api</artifactId> <version>2.0</version> <scope>provided</scope> </dependency> <!--system 编译测试有用、不会运行打成jar--> <dependency> <groupId>com.sun</groupId> <artifactId>tools</artifactId> <scope>system</scope> <optional>true</optional> <version>${java.version}</version> <systemPath>${java.home}/../lib/tools.jar</systemPath> </dependency>
②. Maven的常用设置
①. 全局变量
- ①. 在Maven的pom.xml文件中,properties用于定义全局变量,POM中通过${property_name}的形式引用变量的值。定义全局变量:
<properties> <spring.version>4.3.10.RELEASE</spring.version> </properties>
②. 引用全局变量:
<dependency> <groupId>org.springframework</groupId> <artifactId>spring-context</artifactId> <version>${spring.version}</version> </dependency>
②. Maven系统采用的变量
<properties> <!--源码编译jdk版本--> <maven.compiler.source>1.8</maven.compiler.source> <!--运行代码的jdk版本--> <maven.compiler.target>1.8</maven.compiler.target> <!--项目构建使用的编码,避免中文乱码--> <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding> <!--生成报告的编码--> <project.reporting.outputEncoding>UTF-8</project.reporting.outputEncoding> </properties>
③. 指定资源位置
①. src/main/java和src/test/java这两个目录中的所有*.java文件会分别在comile和test-comiple阶段被编译,编译结果分别放到了target/classes和targe/test-classes目录中,但是这两个目录中的其他文件都会被忽略掉,如果需要把src目录下的文件包放到target/classes目录,作为输出的jar一部分。需要指定资源文件位置。以下内容放到buid标签中
②. IDEA中图解(默认情况下)
在classes中没有A.txt文件出现
③. 需求一:想要A.txt出现在classes中
在pom.xml添加如下内容,然后重新打包即可
<build> <resources> <resource> <!--所在的目录--> <directory>src/main/java</directory> <includes> <!--包括目录下的.properties,.xml 文件都会扫描到--> <include>**/*.properties</include> <include>**/*.xml</include> <include>**/*.txt</include> </includes> <!--filtering 选项 false 不启用过滤器, *.property 已经起到过滤的作用了 --> <filtering>false</filtering> </resource> </resources> </build>
④. 需求二:
在xml中配置如下配置:
<build> <resources> <resource> <directory>src/main/java</directory> <includes> <include>**/*.MF</include> <include>**/*.XML</include> </includes> <filtering>true</filtering> </resource> <resource> <!--资源文件的路径,默认位于${basedir}/src/main/resources/目录下--> <directory>src/main/resources</directory> <!--一组文件名的匹配模式,被匹配的资源文件将被构建过程处理--> <includes> <include>**/*</include> <include>*</include> </includes> <!--filtering默认false,true表示通过参数对资源文件中的${key} 在编译时进行动态变更。替换源可紧-Dkey和pom中的<properties>值 或<filters>中指定的properties文件--> <filtering>true</filtering> </resource> </resources> </build>
④. Maven默认属性
${basedir} 项目根目录 ${version}表示项目版本; ${project.basedir}同${basedir}; ${project.version}表示项目版本,与${version}相同; ${project.build.directory} 构建目录,缺省为target ${project.build.sourceEncoding}表示主源码的编码格式; ${project.build.sourceDirectory}表示主源码路径; ${project.build.finalName}表示输出文件名称; ${project.build.outputDirectory} 构建过程输出目录,缺省为target/classes
输出结果为: test=${pro.name} # F:\\mavenTest\\A 项目根目录 basedir=${basedir} basedir2=${project.basedir} # version=1.0-SNAPSHOT version=${version} # project.build.directory=F:\\mavenTest\\A\\target 构建目录,缺省为target project.build.directory=${project.build.directory} # project.build.sourceDirectory=F:\\mavenTest\\A\\src\\main\\java # 表示主源码的编码格式 project.build.sourceDirectory=${project.build.sourceDirectory} # project.build.finalName=A-1.0-SNAPSHOT 表示输出文件名称 project.build.finalName=${project.build.finalName} # project.build.outputDirectory=F:\\mavenTest\\A\\target\\classes # 构建过程输出目录,缺省为target/classes project.build.outputDirectory=${project.build.outputDirectory}