MAC+IntelliJ IDEA+Maven配置记录

1、下载安装IntelliJ IDEA

社区版功能不全。
mac版官网下载地址:Download IntelliJ Idea for Mac
选择Ultimate版。

IDEA Eva Reset插件

参考文章:IDEA Eva Reset使用方法
下载安装这个插件后,在Help界面会在最下方有Eval Reset的操作选项,点击后勾选

  • auto reset before per restart
    选项,点击reset按钮,重启IDE即可刷新免费体验时间。

2、下载安装Maven

maven的官网地址:maven.apache.org
点击Download,下载binary版本的tar.gz安装包。
解压后放到指定文件夹。

配置maven环境变量

背景简述

打开IDEA的设置界面(Win是Settings,Mac中是Preferences),Build,Execution,Deployment->Build Tools->Maven,可看Maven home path中有IDEA默认的maven版本,将其替换为刚刚下载的maven的目录地址。

User settings file指向的是IDEA中Maven的核心配置文件settings.xml,可看到默认是在一个.m2的文件夹中。如若此前没有安装过maven,打开Finder查看目录时将发现没有.m2这个文件夹。如何创建呢?当系统运行了mvn命令后,将会自动创建.m2文件夹。

但此时在终端直接运行mvn命令,将会提示找不到此命令,原因是还未配置maven的环境变量。

配置步骤

1、打开终端,输入命令,编辑环境变量配置文件

vim ~/.bash_profile

2、定位到文件末尾,按i键进入编辑模式,输入以下内容,其中文件路径部分需替换为自己的路径(鼠标拖动文件即可直接在终端显示文件路径)

# Maven
export MAVEN_HOME=/Users/beckyyang/Maven/apache-maven-3.8.5
export PATH=$PATH:$MAVEN_HOME/bin

3、按Esc键退出编辑模式,然后输入:wq,即保存并退出,回到终端
4、在终端输入以下命令后,按下Enter键使bash_profile生效

source .bash_profile

5、在终端输入mvn -v验证是否配置成功

备注:在这里时遇到报错说JAVA_HOME环境变量没有正确地定义

The JAVA_HOME environment variable is not defined correctly,
this environment variable is needed to run this program.

比对了一下,原来是因为不小心删除了JDK前面的一个小点……
再次输入mvn -v,这次看到了成功配置的信息。

Apache Maven 3.8.5 (3599d3414f046de2324203b78ddcf9b5e4388aa0)
Maven home: /Users/beckyyang/Maven/apache-maven-3.8.5

生成默认m2文件夹

在终端执行以下命令:

mvn help:system

可以看到开始下载很多文件,等待一段时间,完成下载。

[INFO] ------------------------------------------------------------------------
[INFO] BUILD SUCCESS
[INFO] ------------------------------------------------------------------------
[INFO] Total time: 10:11 min
[INFO] Finished at: 2022-03-31T22:32:28+08:00
[INFO] ------------------------------------------------------------------------

在终端输入命令

ls -a

可查看隐藏文件,可以看到.m2文件夹。

3、Maven核心配置文件

进入.m2查看有哪些文件

cd .m2

只显示有一个repository文件夹,没有maven的核心配置文件settings.xml
此时可以打开maven的包文件,打开conf文件夹,复制settings.xml文件到.m2文件夹下即可。
.m2是隐藏文件夹,不能在Finder中直接看到,可在终端中输入命令:

defaults write com.apple.finder AppleShowAllFiles TRUE

设置可见所有文件,再输入

killall Finder

重启Finder,即可看到隐藏文件夹。
再新建一个Finder窗口,将settings.xml文件复制过来即可。

配置文件主要元素简介

localRepository:表示Maven在本地储存信息的本地仓库目录,一般会将路径替换为用户目录下面的……/.m2/repository目录。

<localRepository>/path/to/local/repo</localRepository>

interactiveMode:默认是true,表示是否开启交互模式。如果设为false,那么当Maven需要用户进行输入的时候,它会使用一个默认值。

<interactiveMode>true</interactiveMode>

offline:默认是false,表示在Maven进行项目编译和部署等操作时是否允许Maven进行联网来下载所需要的信息。

<offline>false</offline>

pluginGroups:在pluginGroups元素下面可以定义一系列的pluginGroup元素。表示当通过plugin的前缀来解析plugin的时候到哪里寻找。pluginGroup元素指定的是plugin的groupId。默认情况下,Maven会自动把org.apache.maven.plugins和org.codehaus.mojo添加到pluginGroups下。

    <pluginGroups>
        <!-- pluginGroup
     | Specifies a further group identifier to use for plugin lookup.
    <pluginGroup>com.your.plugins</pluginGroup>
    -->
    </pluginGroups>

proxies:其下面可以定义一系列的proxy子元素,表示Maven在进行联网时需要使用到的代理。当设置了多个代理的时候第一个标记active为true的代理将会被使用。

    <proxies>
        <!-- proxy
     | Specification for one proxy, to be used in connecting to the network.
     |
    <proxy>
      <id>optional</id>
      <active>true</active>
      <protocol>http</protocol>
      <username>proxyuser</username>
      <password>proxypass</password>
      <host>proxy.host.net</host>
      <port>80</port>
      <nonProxyHosts>local.net|some.host.com</nonProxyHosts>
    </proxy>
    -->
    </proxies>

servers:其下面可以定义一系列的server子元素,表示当需要连接到一个远程服务器的时候需要使用到的验证方式,主要有username/password和privateKey/passphrase这两种验证方式。

    <servers>
        <!-- server
     | Specifies the authentication information to use when connecting to a particular server, identified by
     | a unique name within the system (referred to by the 'id' attribute below).
     |
     | NOTE: You should either specify username/password OR privateKey/passphrase, since these pairings are
     |       used together.
     |
    <server>
      <id>deploymentRepo</id>
      <username>repouser</username>
      <password>repopwd</password>
    </server>
    -->

        <!-- Another sample, using keys to authenticate.
    <server>
      <id>siteServer</id>
      <privateKey>/path/to/private/key</privateKey>
      <passphrase>optional; leave empty if not used.</passphrase>
    </server>
    -->
    </servers>

mirrors:用于定义一系列的远程仓库的镜像,可缓解远程仓库的压力。但不能同时配置多个mirror的mirrorOf指向同一个repositoryId。

  • id:id用于区别mirror,可自己更改,但所有mirror的id不能是同一个。
  • mirrorOf:用来表示该mirror是关联的哪一个仓库,其值为其关联仓库的id。当要同时关联多个仓库时,这多个仓库之间可以用逗号隔开;当要关联所有的仓库时,可以使用“”表示;当要关联除某一个仓库以外的其他所有仓库时,可以表示为“,!repositoryId”;当要关联不是localhost或用file请求的仓库时,可以表示为“external:*”。
  • url:镜像地址,maven用此地址来连接远程仓库。
    <mirrors>
        <mirror>
            <!--用于区别mirror,可自己更改-->
            <id>aliyun</id>
            <!--匹配中央仓库(指定阿里的仓库,不可改)-->
            <mirrorOf>central</mirrorOf>
            <!--      镜像名称,可自己更改-->
            <name>aliyun-Mirror</name>
            <!--      镜像地址,不可更改-->
            <url>http://maven.aliyun.com/nexus/content/groups/public</url>
        </mirror>
    </mirrors>

profiles:用于指定一系列的profile子元素。profile元素由activation、repositories、pluginRepositories和properties四个元素组成。当一个profile在settings.xml中是处于活动状态并且在pom.xml中定义了一个相同id的profile时,settings.xml中的profile会覆盖pom.xml中的profile。

  • activation:这是profile中最重要的元素。跟pom.xml中的profile一样,settings.xml中的profile也可以在特定环境下改变一些值,而这些环境是通过activation元素来指定的。
参数说明
activeByDefaulttrue
false
当其值为true的时候表示如果没有其他的profile处于激活状态的时候,该profile将自动被激活。
jdk1.x表示当jdk的版本满足条件的时候激活该profile。
os指定参数name、family、arch、version的值表示当操作系统满足条件的时候激活该profile。
property指定参数name、value的值property是键值对的形式,表示当Maven检测到了这样一个键值对的时候就激活该profile。
file指定参数exists、missing的值表示当文件存在或不存在的时候激活,exists表示存在,missing表示不存在。

完整例子如下:

<profiles>
    <profile>
      <id>test</id>
      <activation>
        <activeByDefault>false</activeByDefault>
        <jdk>1.6</jdk>
        <os>
          <name>Windows 7</name>
          <family>Windows</family>
          <arch>x86</arch>
          <version>5.1.2600</version>
        </os>
        <property>
          <name>mavenVersion</name>
          <value>2.0.3</value>
        </property>
        <file>
          <exists>${basedir}/file2.properties</exists>
          <missing>${basedir}/file1.properties</missing>
        </file>
      </activation>
      ...
    </profile>
  </profiles>
  • properties:用于定义属性键值对。当该profile是激活状态的时候,properties下面指定的属性都可以在pom.xml中使用。
<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>
  • repositories:用于定义远程仓库,当该profile是激活状态的时候,这里面定义的远程仓库将作为当前pom的远程仓库。releases 、snapshots表示对于工件的类型的限制,它们的参数如下:
参数说明
enabledtrue
false
表示这个仓库是否允许这种类型的工件。
updatePolicyalways
daily
interval:minutes(表示每多久更新一次)
never
表示多久尝试更新一次。
checksumPolicyignore
fail
warn
当Maven在部署项目到仓库的时候会连同校验文件一起提交,checksumPolicy表示当这个校验文件缺失或不正确的时候该如何处理。
	<repositories>
        <repository>
          <id>codehausSnapshots</id>
          <name>Codehaus Snapshots</name>
          <releases>
            <enabled>false</enabled>
            <updatePolicy>always</updatePolicy>
            <checksumPolicy>warn</checksumPolicy>
          </releases>
          <snapshots>
            <enabled>true</enabled>
            <updatePolicy>never</updatePolicy>
            <checksumPolicy>fail</checksumPolicy>
          </snapshots>
          <url>http://snapshots.maven.codehaus.org/maven2</url>
          <layout>default</layout>
        </repository>
      </repositories>
  • pluginRepositories:在Maven中有两种类型的仓库,一种是存储工件的仓库,另一种就是存储plugin插件的仓库。pluginRepositories的定义和repositories的定义类似,它表示Maven在哪些地方可以找到所需要的插件.
<!--
     | Here is another profile, activated by the system property 'target-env' with a value of 'dev',
     | which provides a specific path to the Tomcat instance. To use this, your plugin configuration
     | might hypothetically look like:
     |
     | ...
     | <plugin>
     |   <groupId>org.myco.myplugins</groupId>
     |   <artifactId>myplugin</artifactId>
     |
     |   <configuration>
     |     <tomcatLocation>${tomcatPath}</tomcatLocation>
     |   </configuration>
     | </plugin>
     | ...
     |
     | NOTE: If you just wanted to inject this configuration whenever someone set 'target-env' to
     |       anything, you could just leave off the <value/> inside the activation-property.
     -->

activeProfiles:包含一系列的activeProfile元素,表示对于所有的pom都处于活跃状态的profile。

  <activeProfiles>
    <activeProfile>alwaysActiveProfile</activeProfile>
    <activeProfile>anotherAlwaysActiveProfile</activeProfile>
  </activeProfiles>

修改配置文件内容

【1】本地仓库

默认的文件里有被注释掉的当地仓库路径

<localRepository>/path/to/local/repo</localRepository>

将里面的/path/to/local/repo替换为自己的路径即可,例:

<localRepository>/Users/beckyyang/.m2/repository</localRepository>

【2】镜像仓库

因为apache的仓库在国外,平时我们下载东西的时候速度会很慢,因此需要配置一个国内的镜像仓库。配置文件中镜像仓库的默认内容:

<mirrors>
    <!-- mirror
     | Specifies a repository mirror site to use instead of a given repository. The repository that
     | this mirror serves has an ID that matches the mirrorOf element of this mirror. IDs are used
     | for inheritance and direct lookup purposes, and must be unique across the set of mirrors.
     |
    <mirror>
      <id>mirrorId</id>
      <mirrorOf>repositoryId</mirrorOf>
      <name>Human Readable Name for this Mirror.</name>
      <url>http://my.repository.com/repo/path</url>
    </mirror>
     -->
    <mirror>
      <id>maven-default-http-blocker</id>
      <mirrorOf>external:http:*</mirrorOf>
      <name>Pseudo repository to mirror external repositories initially using HTTP.</name>
      <url>http://0.0.0.0/</url>
      <blocked>true</blocked>
    </mirror>
  </mirrors>

将里面的内容改为阿里云的镜像仓库地址

<mirrors>
    <mirror>
<!--      镜像ID可自己更改-->
      <id>aliyun</id>
<!--        匹配中央仓库(指定阿里的仓库,不可改)-->
      <mirrorOf>central</mirrorOf>
<!--      镜像名称,可自己更改-->
      <name>aliyun-Mirror</name>
<!--      镜像地址,不可更改-->
      <url>http://maven.aliyun.com/nexus/content/groups/public</url>
    </mirror>
  </mirrors>

【3】JDK配置

在profile中配置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>
  </profiles>

4、新建Maven工程

Maven工程类型简介

  • POM(Project Object Model,项目对象模型)工程:逻辑工程,用在父级工程或聚合工程中(管理作用),用于做jar包的版本控制。
  • JAR工程:将会打包成jar,用作jar包使用,即常见的本地工程——>Java Project。
  • WAR工程:将会打包城war,是发布在服务器上的工程。

创建MavenDemo项目

create new Project ——> Maven。
不勾选Create from archetype,IDEA会创建标准的Maven项目结构。
创建新项目

  • GroupId:类似包名,是为了防止重名,取名规则一般是域名倒着写,如com.ybq。
  • ArtifactId:一般使用项目名字,如MavenDemo。
  • Version:版本,1.0-snapshot(快照版),即非正式版的项目,正式上线后会去掉snapshot,只留下数字。

Maven标准目录结构

Maven标准目录结构
src/main/java:存储java代码。
src/main/resources:存储主要的资源文件,如xml配置文件、properties文件等。
src/test/java:储存用于测试的类,如JUnit的测试一般就放在此目录下。测试类本身不属于项目,因此maven专门创建了一个测试包,用于存放测试的类。
src/test/resources:存储测试环境用的资源文件。
src:包含了项目所有的源代码和资源文件,以及其他项目相关的文件。
备注:在右侧的maven操作选项中点击install,将会在左侧目录中创建target文件夹。
请添加图片描述
target:编译后内容放置的文件夹。
上图中左侧target目录下的jar包 MavenDemo-1.0-SNAPSHOT.jar 即为该项目的jar包,存放地址为本地仓库中(本地仓库地址/项目GroupId/项目ArtifactId),本例即.m2/respository/com/ybq/MavenDemo中。

POM模式-Maven工程关系

Maven工具是基于POM模式实现的,在Maven中每个项目都相当于是一个对象,项目之间的关系有依赖、继承、聚合,可以让Maven项目更加方便地实现导就jar包、拆分项目等。

  • 依赖

    • 依赖关系:若A工程在开发或运行过程中需要B工程的支持,则代表A工程依赖B工程。
    • 这种情况就需要在A工程的 pom.xml 文件下增加下属配置定义依赖关系。即,导jar包,也可称为将B工程 注入 A工程。
      B工程可以是项目打包后的jar包,也可以是中央仓库的jar包。
    • 注入依赖:在pom.xml文件根元素project下的 <dependencies> 标签中,配置依赖信息,可以包含多个 <dependency> 。每个 <dependency> 都需要包含groupId、artifactId、version 信息,这是依赖的基本坐标,Maven根据坐标才能找到需要的依赖。
    • 官方下载jar包地址:mvnrepository.com
      请添加图片描述
      可在此搜索要添加的jar包名,复制这段代码到pom.xml即可。
      请添加图片描述
      添加依赖后IDEA后标红报错,此时需要点击Maven工具的Reload,待其完成下载后,可在左侧的External Libraries中看到刚刚依赖中添加的jar包。
    • 依赖的传递性:传递性依赖是Maven2.0的新特性。假设你的项目依赖于一个库,而这个库又依赖于其他库,你不必自己去找出所有这些依赖,只需要加上你直接依赖的库,Maven会隐性地把这些间接依赖的库也加入到你的项目中。这个特性是靠解析从远程仓库中获取的依赖库的项目文件实现的。一般这些项目的所有依赖都会加入到项目中,或者从父项目继承,或者通过传递性依赖。PS:创建A项目后,选择Maven工具lifecycle,双击install,项目就会安装到本地仓库中,其他项目就可以通过坐标引用此项目(clean表示删除之前打的jar包,install表示将本项目打jar包,因此重新打包需要先clean再install)。
    • 两个原则
      • 第一原则-最短路径优先原则:项目依赖关系树中路径最短的版本会被使用。例如,若A与D之间的依赖关系有A->B->C->D(v2.0)和A->E->D(v1.0),那么D(v1.0)会被使用,因为A通过E到D的路径最短。
      • 第二原则-最先声明原则:从maven2.0.9开始,当依赖路径长度相等的时候,在POM中依赖声明的顺序决定了谁被解析使用,第一声明者优先,即顺序最靠前的那个依赖优胜。
    • 排除依赖<exclusions>,用来排除传递性依赖,其中可配置多个 <exclusion> 标签,每个 <exclusion> 里有对应的groupId、artifactId、version 三要素。备注:可不用写版本号。
    • 依赖范围:依赖范围决定了依赖的坐标在什么情况下有效,什么情况下无效。
      • compile:默认范围,如果没有指定,就会使用该依赖范围,表示该依赖在编译和运行时都生效
      • provided:已提供依赖范围。使用此依赖范围的Maven依赖典型例子是servlet-api,编译和测试项目的时候需要该依赖,但在运行项目的时候,由于容器已经提供,所以不需要Maven再重复引入。
      • runtime:表明编译时不需要生效,只在运行时生效。典型例子是JDBC驱动实现,项目主代码的编译只需要JDK提供的JDBC接口,只有在执行测试或者运行项目的时候才需要实现上述接口的具体JDBC驱动。
      • system:范围与provided类似,但必须显式指定一个本地系统路径的JAR,此类依赖应该一直有效,Maven也不会去仓库寻找它。但是,使用system范围依赖时必须通过systemPath元素显式指定依赖文件的本地路径。
      • test:表明使用该范围的依赖只在编译测试代码和运行测试的时候需要,应用的正常运行不需要此类依赖。典型例子是JUnit,只在测试阶段用,导出项目的时候没有必要导出Junit的东西,所以在JUnit的坐标下加入scope-test。
      • import:只适用于pom文件中的<dependencyManagement>部分,表明指定的POM必须使用<dependencyManagement>部分的依赖。注意:import只能用在<dependencyManagement>的scope里。
  • 继承

    • 继承关系:如果A工程继承B工程,则代表A工程默认依赖B工程依赖的所有资源,且可以应用B工程中定义的所有资源信息。被继承的B工程只能是POM工程。注意:在父项目中被放在<dependencyManagement>中的内容不被子项目继承,不能直接使用。<dependencyManagement>是为了方便进行版本管理,里面的内容在子项目依赖时坐标只需要填写groupId和artifactId即可,但如子项目不希望使用父项目的版本,则可以明确配置version。

举例:父项目中在properties中设置一个标签叫banben,然后在dependencyManagement中设置version取banben的值,这样就实现了版本管理。其后的scope如果设值为import,则表明强制让子项目使用此版本的依赖。

    <properties>
        <banben>3.5.6</banben>
    </properties>
    
    <dependencyManagement>
        <dependencies>
            <dependency>
                <groupId>org.mybatis</groupId>
                <artifactId>mybatis</artifactId>
                <version>${banben}</version>
                <scope>import</scope>
            </dependency>
        </dependencies>
    </dependencyManagement>

子项目中:

	<parent>
        <artifactId>MavenDemo</artifactId>
        <groupId>com.ybq</groupId>
        <version>1.0-SNAPSHOT</version>
        <relativePath>../MavenDemo/pom.xml</relativePath>
    </parent>
    <denpendencies>
    	<denpendency>
    		<groupId>org.mybatis</groupId>
    		<artifactId>mybatis</artifactId>
    	</denpendency>
    </denpendencies>
  • 聚合
    • 聚合工程的总工程必须是一个POM工程(Maven Project),jar项目和war项目不能做聚合工程,各子模块可以是任意来诶新模块(Maven Model)。
    • 前提:继承,聚合包含了继承的特性。
    • 聚合时多个项目的本质还是一个项目,这些小项目被一个大的父项目包含,且父项目类型为POM工程。父项目的pom.xml中 <modules> 包含所有模块。

举例,父项目pom.xml:

	<groupId>com.ybq</groupId>
    <artifactId>ParentPro</artifactId>
    <version>1.0-SNAPSHOT</version>
<!--定义为POM项目-->
    <packaging>pom</packaging>

    <properties>
        <maven.compiler.source>8</maven.compiler.source>
        <maven.compiler.target>8</maven.compiler.target>
<!--        定义版本号-->
        <mybatis.version>3.5.6</mybatis.version>
        <spring.version>5.3.18</spring.version>
    </properties>

    <dependencyManagement>
        <dependencies>
            <!-- https://mvnrepository.com/artifact/org.mybatis/mybatis -->
            <dependency>
                <groupId>org.mybatis</groupId>
                <artifactId>mybatis</artifactId>
                <version>${mybatis.version}</version>
            </dependency>
            <!-- https://mvnrepository.com/artifact/org.springframework/spring-core -->
            <dependency>
                <groupId>org.springframework</groupId>
                <artifactId>spring-core</artifactId>
                <version>${spring.version}</version>
            </dependency>
            <!-- https://mvnrepository.com/artifact/org.springframework/spring-context -->
            <dependency>
                <groupId>org.springframework</groupId>
                <artifactId>spring-context</artifactId>
                <version>${spring.version}</version>
            </dependency>
        </dependencies>
    </dependencyManagement>

新建Module,输入子项目名称:
请添加图片描述
在子项目中添加父项目中的依赖,并用Maven工具中的reload刷新,可看到已经引用了父项目的此依赖。
请添加图片描述
再查看父项目中的pom.xml,可看到已自动添加了子模块代码。
请添加图片描述
未完待续……

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

茶如影

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值