maven

dependencyManagement与dependencies区别

说明

dependencyManagement里只是声明依赖,指定版本,并不实现引入,因此子项目需要显式的声明需要用的依赖。如果不在子项目中声明依赖,是不会从父项目中继承下来的;只有在子项目中写了该依赖项,并且没有指定具体版本,才会从父项目中继承该项,并且version和scope都读取自父pom;另外如果子项目中指定了版本号,那么会使用子项目中指定的jar版本。

dependencies即使在子模块中不写该依赖项,那么子模块仍然会从父项目中继承该依赖项(全部继承)。

maven的常用命令

${basedir}存放pom.xml和所有的子目录
${basedir}/src/main/java项目的java源代码
${basedir}/src/main/resources项目的资源,比如说property文件,springmvc.xml
mvn clean表示运行清理操作(会默认把target文件夹中的数据清理)
mvn clean compile表示先运行清理之后运行编译
mvn clean package运行清理和打包
mvn clean install运行清理和安装,会将打好的包安装到本地仓库
mvn clean deploy运行清理和发布(发布到私服上面)
mvn dependency:resolve重新导入maven依赖的jar包,idea经常使用

补充:

Maven命令行中,可以使用以下指令来根据pom.xml文件下载项目依赖,需要在包含pom.xml文件的项目根目录下执行。确保你已经配置好了Maven环境,并且可以正常运行Maven命令。

mvn dependency:resolve

以下是几个Maven的常用命令及其作用:

 mvn clean: 清理项目,删除target目录,移除编译和测试过程中产生的临时文件和结果。
 mvn compile: 编译项目的源代码,将.java文件转化为.class文件,并放置在target/classes目录下。
 mvn test: 运行项目的单元测试,通常位于src/test/java目录下。
 mvn package: 打包项目,如对于Java项目,会创建一个JAR或WAR文件,放置在target目录下。
 mvn install: 在执行package之后,将打包好的文件安装到本地Maven仓库,这样其他项目就可以作为依赖引用这个项目。
 mvn deploy: 通常用于将最终的工件部署到远程仓库,比如私有的Maven仓库服务器,让其他开发者或构建系统可以访问。
 mvn validate: 验证项目配置,确保项目可以被正确构建。
 mvn site: 生成项目站点文档,包括报告和项目信息。
 mvn dependency:tree: 显示项目的依赖树,帮助理解依赖关系。
 mvn help:effective-pom: 显示项目的实际生效POM,包括继承和聚合后的所有配置。
 如果你需要使用Maven Formatter Plugin来格式化代码,你需要在pom.xml中配置该插件,然后运行相应的目标,如mvn formatter:format。请注意,这并不是Maven的内置命令,而是使用插件提供的扩展命令

pom文件结构

<project xmlns = "http://maven.apache.org/POM/4.0.0"
         xmlns:xsi = "http://www.w3.org/2001/XMLSchema-instance"
         xsi:schemaLocation = "http://maven.apache.org/POM/4.0.0
                               http://maven.apache.org/xsd/maven-4.0.0.xsd">
  
  <!-- 模型版本 -->
  <modelVersion>4.0.0</modelVersion>
  <!-- 公司或者组织的唯一标志,并且配置时生成的路径也是由此生成, 如com.companyname.project-group,maven会将该项目打成的jar包放本地路径:/com/companyname/project-group -->
  <groupId>com.companyname.project-group</groupId>
  
  <!-- 项目的唯一ID,一个groupId下面可能多个项目,就是靠artifactId来区分的 -->
  <artifactId>project</artifactId>
  
  <!-- 版本号 -->
  <version>1.0</version>
  <!-- 继承自该项目的所有子项目的默认依赖信息。这部分的依赖信息不会被立即解析,而是当子项目声明一个依赖(必须描述group ID和 artifact 
        ID信息),如果group ID和artifact ID以外的一些信息没有描述,则通过group ID和artifact ID 匹配到这里的依赖,并使用这里的依赖信息。 -->
  <dependencyManagement>
    <dependencies>
      <!--参见dependencies/dependency元素 -->
      <dependency>
        ......
      </dependency>
    </dependencies>
  </dependencyManagement>
  <!--该元素描述了项目相关的所有依赖。 这些依赖组成了项目构建过程中的一个个环节。它们自动从项目定义的仓库中下载。要获取更多信息,请看项目依赖机制。 -->
  <dependencies>
    <dependency>
      <!--依赖的group ID -->
      <groupId>org.apache.maven</groupId>
      <!--依赖的artifact ID -->
      <artifactId>maven-artifact</artifactId>
      <!--依赖的版本号。 在Maven 2里, 也可以配置成版本号的范围。 -->
      <version>3.8.1</version>
      <!-- 依赖类型,默认类型是jar。它通常表示依赖的文件的扩展名,但也有例外。一个类型可以被映射成另外一个扩展名或分类器。类型经常和使用的打包方式对应, 
                尽管这也有例外。一些类型的例子:jar,war,ejb-client和test-jar。如果设置extensions为 true,就可以在 plugin里定义新的类型。所以前面的类型的例子不完整。 -->
      <type>jar</type>
      <!-- 依赖的分类器。分类器可以区分属于同一个POM,但不同构建方式的构件。分类器名被附加到文件名的版本号后面。例如,如果你想要构建两个单独的构件成 
                JAR,一个使用Java 1.4编译器,另一个使用Java 6编译器,你就可以使用分类器来生成两个单独的JAR构件。 -->
      <classifier></classifier>
      <!--依赖范围。在项目发布过程中,帮助决定哪些构件被包括进来。欲知详情请参考依赖机制。 - compile :默认范围,用于编译 - provided:类似于编译,但支持你期待jdk或者容器提供,类似于classpath 
                - runtime: 在执行时需要使用 - test: 用于test任务时使用 - system: 需要外在提供相应的元素。通过systemPath来取得 
                - systemPath: 仅用于范围为system。提供相应的路径 - optional: 当项目自身被依赖时,标注依赖是否传递。用于连续依赖时使用 -->
      <scope>test</scope>
      <!--仅供system范围使用。注意,不鼓励使用这个元素,并且在新的版本中该元素可能被覆盖掉。该元素为依赖规定了文件系统上的路径。需要绝对路径而不是相对路径。推荐使用属性匹配绝对路径,例如${java.home}。 -->
      <systemPath></systemPath>
      <!--当计算传递依赖时, 从依赖构件列表里,列出被排除的依赖构件集。即告诉maven你只依赖指定的项目,不依赖项目的依赖。此元素主要用于解决版本冲突问题 -->
      <exclusions>
        <exclusion>
          <artifactId>spring-core</artifactId>
          <groupId>org.springframework</groupId>
        </exclusion>
      </exclusions>
      <!--可选依赖,如果你在项目B中把C依赖声明为可选,你就需要在依赖于B的项目(例如项目A)中显式的引用对C的依赖。可选依赖阻断依赖的传递性。 -->
      <optional>true</optional>
    </dependency>
  </dependencies>
</project>

增加servers节点让maven支持http

<!-- 添加servers部分以支持HTTP仓库 -->
  <!-- 添加mirrors部分来覆盖默认的HTTP阻断 -->
  <mirrors>
    <mirror>
      <id>rdc-releases-mirror</id>
      <mirrorOf>rdc-releases</mirrorOf>
      <url>http://10.184.177.156/service/app-sandbox/file/download?storageKey=maven-dependencies/release/</url>
    </mirror>
    <mirror>
      <id>rdc-snapshots-mirror</id>
      <mirrorOf>rdc-snapshots</mirrorOf>
      <url>http://10.184.177.156/service/app-sandbox/file/download?storageKey=maven-dependencies/snapshot/</url>
    </mirror>
  </mirrors>
  <servers>
    <server>
      <id>rdc-releases</id>
      <configuration>
        <httpConfiguration>
          <get>
            <useSystemProperties>true</useSystemProperties>
          </get>
        </httpConfiguration>
      </configuration>
    </server>
    <server>
      <id>rdc-snapshots</id>
      <configuration>
        <httpConfiguration>
          <get>
            <useSystemProperties>true</useSystemProperties>
          </get>
        </httpConfiguration>
      </configuration>
    </server>
  </servers>