IntelliJ IDEA配置记录
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元素来指定的。
参数 | 值 | 说明 |
---|---|---|
activeByDefault | true false | 当其值为true的时候表示如果没有其他的profile处于激活状态的时候,该profile将自动被激活。 |
jdk | 1.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表示对于工件的类型的限制,它们的参数如下:
参数 | 值 | 说明 |
---|---|---|
enabled | true false | 表示这个仓库是否允许这种类型的工件。 |
updatePolicy | always daily interval:minutes(表示每多久更新一次) never | 表示多久尝试更新一次。 |
checksumPolicy | ignore 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标准目录结构
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,可看到已自动添加了子模块代码。
未完待续……