参考
参考
1. 指定本地仓库位置 <localRepository>E:\IDEA\Maven\apache-maven-3.8.3\my_repos</localRepository> 2. 配置阿里云提供的镜像仓库,mirrors标签下 <mirror> <id>nexus-aliyun</id> <mirrorOf>central</mirrorOf> <name>Nexus aliyun</name> <url>http://maven.aliyun.com/nexus/content/groups/public</url> </mirror> 3. 配置 Maven 工程的基础 JDK 版本,profiles标签下 <profile> <id>jdk-1.8</id> <activation> <activeByDefault>true</activeByDefault> <jdk>1.8</jdk> </activation> <properties> <maven.compiler.source>1.8</maven.compiler.source> <maven.compiler.target>1.8</maven.compiler.target> <maven.compiler.compilerVersion>1.8</maven.compiler.compilerVersion> </properties> </profile>
// 例如junit依赖 <dependency> <groupId>org.junit.jupiter</groupId> <artifactId>junit-jupiter-api</artifactId> <version>5.3.2</version> <scope>test</scope> </dependency>
<dependency> <groupId>mysql</groupId> <artifactId>mysql-connector-java</artifactId> <version>5.1.48</version> <scope>runtime</scope> </dependency>
<!--此处的依赖项由Tomcat提供,所以依赖范围为provided--> <dependency> <groupId>javax.servlet</groupId> <artifactId>javax.servlet-api</artifactId> <version>4.0.0</version> <scope>provided</scope> </dependency>
<!--依赖范围为import的使用要求:--> <!--打包类型必须是 pom--> <!--必须放在 dependencyManagement 中--> <dependencyManagement> <dependencies> <!-- SpringCloud 依赖导入 --> <dependency> <groupId>org.springframework.cloud</groupId> <artifactId>spring-cloud-dependencies</artifactId> <version>Hoxton.SR9</version> <type>pom</type> <scope>import</scope> </dependency> <!-- SpringCloud Alibaba 依赖导入 --> <dependency> <groupId>com.alibaba.cloud</groupId> <artifactId>spring-cloud-alibaba-dependencies</artifactId> <version>2.2.6.RELEASE</version> <type>pom</type> <scope>import</scope> </dependency> </dependencies> </dependencyManagement>
<dependency> <groupId>javax.servlet</groupId> <artifactId>servlet-api</artifactId> <version>2.0</version> <systemPath>E:\IDEA\Tomcat\apache-tomcat-8\apache-tomcat-8.5.71\lib\servlet-api.jar</systemPath> <scope>system</scope> </dependency>
Maven如何知道从何处下载所需的依赖?也就是相关的jar包?
如果用户主目录下的.m2目录下(默认情况下本地仓库的位置)没有需要的jar包就到中央仓库下载。
如果访问Maven的中央仓库非常慢,我们可以选择一个速度较快的Maven的镜像仓库。解决办法参考
对于某个依赖,Maven只需要3个变量即可唯一确定某个jar包.
1. groupId:属于组织的名称,类似Java的包名; 2. artifactId:该jar包自身的名称,类似Java的类名; 3. version:该jar包的版本。
注:只有以-SNAPSHOT结尾的版本号会被Maven视为开发版本,开发版本每次都会重复下载,这种SNAPSHOT版本只能用于内部私有的Maven repo,公开发布的版本不允许出现SNAPSHOT。
如果我们要引用一个第三方组件,比如okhttp,如何确切地获得它的groupId、artifactId和version?方法是通过search.maven.org
网址搜索关键字,找到对应的组件后,直接复制
<dependency> <groupId>com.avito.android</groupId> <artifactId>okhttp</artifactId> <version>2021.36</version> </dependency>
1. Clean Lifecycle 在进行真正的构建之前进行一些清理工作。 2. Default Lifecycle 构建的核心部分,编译,测试,打包,部署等等。 3. Site Lifecycle 生成项目报告,站点,发布站点。
1. validate 2. initialize 3. generate-sources 4. process-sources 5. generate-resources 6. process-resources 7. compile 8. process-classes 9. generate-test-sources 10. process-test-sources 11. generate-test-resources 12. process-test-resources 13. test-compile 14. process-test-classes 15. test 16. prepare-package 17. package 18. pre-integration-test 19. integration-test 20. post-integration-test 21. verify 22. install 23. deploy
1. pre-clean 执行一些需要在clean之前完成的工作 2. clean 移除所有上一次构建生成的文件 3. post-clean 执行一些需要在clean之后立刻完成的工作
1. pre-site 执行一些需要在生成站点文档之前完成的工作 2. site 生成项目的站点文档 3. post-site 执行一些需要在生成站点文档之后完成的工作,并且为部署做准备 4. site-deploy 将生成的站点文档部署到特定的服务器上
mvn phase
Maven自动根据生命周期运行到指定的phase。 如果我们运行mvn package,Maven就会执行default生命周期,它会从开始一直运行到package这个phase为止。运行任何一个阶段的时候,它所在周期的前面的所有阶段都会被运行
实际开发中常用的命令
# 这个clean是Clean生命周期的一个阶段 mvn clean:清理所有生成的class和jar;(即删除target目录) mvn test-compile: 测试程序编译 测试程序编译结果存放的目录:target/test-classes 主体程序编译结果存放的目录:target/classes mvn clean compile:先清理,再执行到compile; mvn clean test:先清理,再执行到test,因为执行test前必须执行compile,所以这里不必指定compile; mvn clean package:先清理,再执行到package。
自定义插件在pom.xml中声明
Maven Wrapper就是给一个项目提供一个独立的,指定版本的Maven给它使用。
将自己的库发布到Maven的repo的方法
<!-- jar:表示这个工程是一个Java工程 --> <!-- war:表示这个工程是一个Web工程 --> <!-- pom:表示这个工程是“管理其他工程”的工程 -->
<properties> <!-- 工程构建过程中读取源码时使用的字符集 --> <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding> </properties>
<dependency> <groupId>junit</groupId> <artifactId>junit</artifactId> <version>4.11</version> <scope>test</scope> <!-- 使用excludes标签配置依赖的排除 --> <exclusions> <!-- 在exclusion标签中配置一个具体的排除 --> <exclusion> <groupId>org.hamcrest</groupId> <artifactId>hamcrest-core</artifactId> </exclusion> </exclusions> </dependency>
<!-- 被管理的依赖并没有真正被引入到工程 --> <dependencyManagement> <dependencies> ... </dependencies> </dependencyManagement>
<!--自定义属性spring.version--> <properties> <spring.version>1.2.6</spring.version> </properties> <!--自定义属性的引用--> <dependency> <groupId>springframework</groupId> <artifactId>spring-context</artifactId> <version>${spring.version}</version> </dependency>
<!--build标签定制Maven的构建行为--> <build> <!--Maven构建的时候使用到的插件--> <plugins> <!-- plugin 标签:这是我要指定的一个具体的插件 --> <plugin> <!-- 插件的坐标。此处引用的 maven-compiler-plugin 插件不是第三方的,是一个 Maven 自带的插件。 --> <groupId>org.apache.maven.plugins</groupId> <artifactId>maven-compiler-plugin</artifactId> <version>3.1</version> <!-- configuration 标签:配置 maven-compiler-plugin 插件 --> <configuration> <!-- 具体配置信息会因为插件不同、需求不同而有所差异 --> <source>1.8</source> <target>1.8</target> <encoding>UTF-8</encoding> </configuration> </plugin> </plugins> </build>
<!-- START SNIPPET: superpom --> <project> <modelVersion>4.0.0</modelVersion> <repositories> <repository> <id>central</id> <name>Central Repository</name> <url>https://repo.maven.apache.org/maven2</url> <layout>default</layout> <snapshots> <enabled>false</enabled> </snapshots> </repository> </repositories> <pluginRepositories> <pluginRepository> <id>central</id> <name>Central Repository</name> <url>https://repo.maven.apache.org/maven2</url> <layout>default</layout> <snapshots> <enabled>false</enabled> </snapshots> <releases> <updatePolicy>never</updatePolicy> </releases> </pluginRepository> </pluginRepositories> <build> <!--定义约定的目录结构--> <directory>${project.basedir}/target</directory> <outputDirectory>${project.build.directory}/classes</outputDirectory> <finalName>${project.artifactId}-${project.version}</finalName> <testOutputDirectory>${project.build.directory}/test-classes</testOutputDirectory> <sourceDirectory>${project.basedir}/src/main/java</sourceDirectory> <scriptSourceDirectory>${project.basedir}/src/main/scripts</scriptSourceDirectory> <testSourceDirectory>${project.basedir}/src/test/java</testSourceDirectory> <resources> <resource> <directory>${project.basedir}/src/main/resources</directory> </resource> </resources> <testResources> <testResource> <directory>${project.basedir}/src/test/resources</directory> </testResource> </testResources> <pluginManagement> <!-- NOTE: These plugins will be removed from future versions of the super POM --> <!-- They are kept for the moment as they are very unlikely to conflict with lifecycle mappings (MNG-4453) --> <plugins> <plugin> <artifactId>maven-antrun-plugin</artifactId> <version>1.3</version> </plugin> <plugin> <artifactId>maven-assembly-plugin</artifactId> <version>2.2-beta-5</version> </plugin> <plugin> <artifactId>maven-dependency-plugin</artifactId> <version>2.8</version> </plugin> <plugin> <artifactId>maven-release-plugin</artifactId> <version>2.5.3</version> </plugin> </plugins> </pluginManagement> </build> <reporting> <outputDirectory>${project.build.directory}/site</outputDirectory> </reporting> <profiles> <!-- NOTE: The release profile will be removed from future versions of the super POM --> <profile> <id>release-profile</id> <activation> <property> <name>performRelease</name> <value>true</value> </property> </activation> <build> <plugins> <plugin> <inherited>true</inherited> <artifactId>maven-source-plugin</artifactId> <executions> <execution> <id>attach-sources</id> <goals> <goal>jar-no-fork</goal> </goals> </execution> </executions> </plugin> <plugin> <inherited>true</inherited> <artifactId>maven-javadoc-plugin</artifactId> <executions> <execution> <id>attach-javadocs</id> <goals> <goal>jar</goal> </goals> </execution> </executions> </plugin> <plugin> <inherited>true</inherited> <artifactId>maven-deploy-plugin</artifactId> <configuration> <updateReleaseInfo>true</updateReleaseInfo> </configuration> </plugin> </plugins> </build> </profile> </profiles> </project> <!-- END SNIPPET: superpom -->
项目中引入不是用Maven的方式发布的jar包。
// Windows 系统下使用 ^ 符号换行;Linux 系统用 \ mvn install:install-file -Dfile=[体系外 jar 包路径] \ -DgroupId=[给体系外 jar 包强行设定坐标] \ -DartifactId=[给体系外 jar 包强行设定坐标] \ -Dversion=1 \ -Dpackage=jar // 示例: mvn install:install-file -Dfile=E:\spring\java_pro\out\artifacts\java_pro\java_pro.jar ^-DgroupId=com.nrvcer ^-DartifactId=java_pro ^-Dversion=1 ^-Dpackaging=jar