maven——项目构建和依赖管理工具

apache maven是一个用于项目构建和依赖管理的工具。

添加archetype

https://repo1.maven.org/maven2/archetype-catalog.xml

更改本地仓库存储位置:修改配置文件${user.home}/.m2/settings.xml或 $MAVEN_HOME/conf/setting.xml中的内容

<localRepository>...

mvn archetype:generate会非常慢,搜索了本地和远程太多archetype,而加上-DarchetypeCatalog=local将只搜索${user.home}/.m2/archetype-catalog.xml中定义的本地archetype,会大大提高速度。

mvn archetype:crawl会根据远程数据生成本地archetype目录$maven_localRepository/archetype-catalog.xml。

download jar, sources, javadoc

 mvn dependency:get -Dartifact=groupId:artifactId:version[:packaging[:classifier]]
 eg.    mvn dependency:get -Dartifact=mysql:mysql-connector-java:LATEST
        mvn dependency:get -Dartifact=mysql:mysql-connector-java:LATEST:jar:sources

download sources/javadoc

 mvn dependency:sources -DincludeGroupIds=grouId1,groupId2... -Dclassifier=sources
 mvn dependency:get -Dartifact=mysql:mysql-connector-java:LATEST:jar:sources

download sources for each of dependencies in pom.xml
 mvn dependency:sources
 mvn dependency:resolve -Dclassifier=sources
download javadoc
 mvn dependency:get -Dartifact=mysql:mysql-connector-java:LATEST:jar:javadoc
 # download javadoc for each of dependencies in pom.xml
 mvn dependency:sources -Dclassifier=javadoc
 mvn dependency:resolve -Dclassifier=javadoc

copy dependecies

mvn dependency:copy -Dartifact=g:a:v -o -DrepoUrl=file://path/to/your/repo
mvn org.apache.maven.plugins:maven-dependency-plugin:2.8:copy -Dartifact=groupId:artifactId:version[:packaging][:classifier] -DoutputDirectory=[target] 

输出依赖jar包文件路径

mvn dependency:build-classpath [-Dmdep.outputFile=/path/file](输出到文件)

mvn基本的几个jar包相关命令:
mvn clean 清除target/编译文件夹
mvn compile 编译源码
mvn package 编译并打包为jar文件
mvn install 将jar文件安装到本地repo
mvn deploy 根据pom.xml中的信息,将jar包部署到远程repo

跳过测试
mvn -DskipTests

指定pom文件
mvn -f some-pom.xml

插件描述文档

mvn help:describe -Ddetail -Dplugin=<plugin-name> 或 -Dcmd=<plugin>:<phase>
# mvn help:describe -Dplugin=exec
# mvn help:describe -Dcmd=install:install-file
# mvn help:describe -Dplugin=g:a:v

关闭mvn的日志输出
mvn -q

生成源码jar包
mvn source:jar

maven 3.x super pom位置
$M2_HOME/lib/maven-model-builder-3.x.jar:/org/apache/maven/model/pom-4.0.0.xml

unresolved

list addable dependencies in local repository
list addable dependencies all available repositories
list achetypes

(不可用)get file path of artifact
mvn dependency:location -Dartifact=g???v

生成javadoc.jar接口文档包

mvn javadoc:jar
需要添加plugin: org.apache.maven.plugins:maven-javadoc-plugin

生成sources.jar源码包

mvn source:jar
需要添加plugin: org.apache.maven.plugins:maven-source-plugin

mvn命令发布到nexus私服
mvn deploy
如果需要同时发布sources.jar, javadoc.jar,需在生成这些包后执行命令。
执行命令需要pom中有<distributionManagement/repository|snapshotRepository>的配置,同时maven公有settings.xml中下配置nexus私服登录的用户名密码。

<!-- pom.xml -->
<distributionManagement>
        <repository>
            <id>my-mvn</id> <!-- 必须与settings.xml中定义的id一致 -->
            <!--为hosted服务类型的地址,否则400错误,另外,部署一个已存在的jar包也会400 -->
            <url>http://exmaples.com/nexus/content/repositories/releases/</url>
        </repository>
        <snapshotRepository>
            <id>my-mvn</id>
            <url>http://exmaples.com/nexus/content/repositories/snapshots/</url>
        </snapshotRepository>
</distributionManagement>

<!-- maven settings.xml -->
<servers>
  <server>
      <id>my-mvn</id>
      <username>admin</username>
      <password>secret-pwd</password>
  </server>
</servers>

<!-- 发布源码包/文档包时依赖的plugin -->
<build>
    <plugins>
        <plugin>
            <groupId>org.apache.maven.plugins</groupId>
            <artifactId>maven-source-plugin</artifactId>
            <version>3.0.0</version>
            <executions>
                <execution>
                    <goals>
                        <goal>jar</goal>
                    </goals>
                </execution>
            </executions>
        </plugin>
        <plugin>
            <groupId>org.apache.maven.plugins</groupId>
            <artifactId>maven-javadoc-plugin</artifactId>
            <version>3.0.0</version>
            <executions>
                <execution>
                    <goals>
                        <goal>jar</goal>
                    </goals>
                </execution>
            </executions>
        </plugin>
    </plugins>
</build>

删除损坏jar包

remove damaged jars.
网络条件恶劣会导致下载的jar是不完整的或者损坏的(corrupted),而添加这种jar包的依赖会导致读取到不正确的class(加了jar包却找不到对应class),此时我们需要找出本地maven库中损坏的jar,然后删除它们,重新下载,命令行脚本:

cd $M2_REPO;
for f in `find -type f -iname '*.jar' -printf '%P\n'`; do unzip -tq "$f" &>/dev/null; [[ $? -ne 0 ]] && echo "$f" | tee -a ~/corruptedmvnjar ; done;
cd -

打包mave项目及其依赖

一般建议用功能更丰富的shade插件,而非assembly。

编译出错

仔细看输出ERROR日志,如提示某个类miss,除了看是否添加了该类的依赖,scop是否对应以外,还需看这个类所在依赖是否使用了其他依赖,而其他依赖却没有添加,或者版本不兼容。

打包到nexus:

pom.xml

    <distributionManagement>
        <snapshotRepository>
            <id>ossrh</id>
            <name>Sonatype Nexus Snapshots</name>
            <url>https://oss.sonatype.org/content/repositories/snapshots/</url>
        </snapshotRepository>
        <repository>
            <id>ossrh</id>
            <name>Nexus Release Repository</name>
            <url>https://oss.sonatype.org/service/local/staging/deploy/maven2/</url>
        </repository>
    </distributionManagement>

增量复制maven库

cd $M2_REPO
zip -r -u ~/Downloads/mvnrepo.zip *  # 可加选项排除部分大ja包

maven仓库镜像

添加仓库镜像,解决下载慢的问题

<!--阿里云-->
<mirror>
      <id>alimaven</id>
      <name>aliyun maven</name>
      <url>http://maven.aliyun.com/nexus/content/groups/public/</url>
      <mirrorOf>central</mirrorOf>
</mirror>
<!--华为云-->
    <mirror>
      <id>huaweicloud</id>
      <!--官方将这里的mirrorOf设为*,会导致私库不可用-->
      <mirrorOf>central</mirrorOf>
      <url>https://mirrors.huaweicloud.com/repository/maven/</url>
    </mirror>
<!--华为云镜像登录信息-->
    <server>
      <id>huaweicloud</id>
      <username>anonymous</username>
      <password>devcloud</password>
    </server> 

镜像会拦截所有通往被镜像的请求。因此若镜像更新不及时,导致镜像中没有本已存在于被镜像repo(如maven central)的artifact时,mvn下载会失败。

maven私有库
--
添加私有库 settings.xml

<profile>
 <id>...</id>
 <repositories>...
 <pluginRe...>

</profile>

maven项目添加自己提供的jar:

修改plugin默认版本

修改文件$M2_HOME/lib/maven-core-xxx.jar!:/META-INF/plexus/components.xml及default-bindings.xml中对应plugin的版本

maven java

pom.xml中最常用的设置jdk、项目文件编码的代码如下:

<properties>
    <!--设置java源码版本-->
    <maven.compiler.source>1.8<maven.compiler.source>
    <!--设置字节码版本-->
    <maven.compiler.target>1.8<maven.compiler.target>
    <!--在maven-compiler-plugin:3.8以后支持jdk9+,设置maven.compiler.release,同时显式设置maven-compiler-plugin的版本为3.8或更高-->
    <maven.compiler.release>11</maven.compiler.release>
    <!--如果在<build/plugins>显式配置了<artifactId>maven-compiler-plugin</artifactId>中的<execution>,则上述通过propert指定java版本的方式不再起作用,需在<execution/configuration>中配置<source>,<target>-->
    <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
</properties>

maven scala

<project>
<!--repo&pluginRepo不是非得添加-->
  <repositories>
    <repository>
      <id>scala-tools.org</id>
      <name>Scala-Tools Maven2 Repository</name>
      <url>http://scala-tools.org/repo-releases</url>
    </repository>
  </repositories>
  <pluginRepositories>
    <pluginRepository>
      <id>scala-tools.org</id>
      <name>Scala-Tools Maven2 Repository</name>
      <url>http://scala-tools.org/repo-releases</url>
    </pluginRepository>
  </pluginRepositories>

  <dependencies>
    <dependency>
      <groupId>org.scala-lang</groupId>
      <artifactId>scala-library</artifactId>
      <version>${scala.version}</version>
    </dependency>
  </dependencies>
<build>
    <plugins>
    <!-- maven-scala-plugin非官方出品,已迁移到以下gav -->
      <plugin>
        <groupId>net.alchim31.maven</groupId>
        <artifactId>scala-maven-plugin</artifactId>
        <executions>
            <execution>
                <id>scala-compile-first</id>
                <phase>process-resources</phase>
                <goals>
                    <goal>add-source</goal>
                    <goal>compile</goal>
                </goals>
            </execution>
            <execution>
                <id>scala-test-compile</id>
                <phase>process-test-resources</phase>
                <goals>
                    <goal>testCompile</goal>
                </goals>
            </execution>
        </executions>
      </plugin>
      <!--加java编译器-->
      <plugin>
            <artifactId>maven-compiler-plugin</artifactId>
            <version>3.7.0</version>
      </plugin>
      <!--<plugin>
        <groupId>org.scala-tools</groupId>
        <artifactId>maven-scala-plugin</artifactId>
        <executions>
          <execution>
            <goals>
              <goal>compile</goal>
              <goal>testCompile</goal>
            </goals>
          </execution>
        </executions>
        <configuration>
          <scalaVersion>${scala.version}</scalaVersion>
          <mainSourceDir>src/main/scala</mainSourceDir>
          <testSourceDir>src/test/scala</testSourceDir>
        </configuration>
      </plugin>-->
    </plugins>
  </build>
</project>

kotlin maven

<properties>
    <!--增量编译-->
    <kotlin.compiler.incremental>true</kotlin.compiler.incremental>
</properties>

<dependency>
    <groupId>org.jetbrains.kotlin</groupId>
    <artifactId>kotlin-stdlib</artifactId>
    <!--使用jdk特定版本扩展-->
    <!--<artifactId>kotlin-stdlib-jre8</artifactId>-->
    <!--<artifactId>kotlin-stdlib-jre7</artifactId>-->
    <version>${kotlin.version}</version>
</dependency>
<!--kotlin reflect反射相关-->
<dependency>
    <artifactId>kotlin-reflect</artifactId>
</dependency>

shade-plugin:

<plugin>
    <artifactId>maven-shade-plugin</artifactId>
    <version>3.1.0</version>
    <configuration>
        <!--别生成dependency-reduced-pom.xml文件-->
        <createDependencyReducedPom>false</createDependencyReducedPom>
    </configuration>
    <executions>
        <execution>
            <!-- 加入package和goal:shade,否则mvn shade:shade不允许直接从命令行执行,加此可直接mvn package -->
            <phase>package</phase>
            <goals>
                <goal>shade</goal>
            </goals>
            <configuration>
                <transformers>
                    <!--将同名资源文件整合成一个-->
                    <transformer
implementation="org.apache.maven.plugins.shade.resource.AppendingTransformer">
          <resource>application.properties</resource>
                    </transformer>
                     <!-- 定义manifest中main类 -->
                    <transformer implementation="org.apache.maven.plugins.shade.resource.ManifestResourceTransformer">
                     <mainClass>com.examples.AppMain</mainClass>
                     <manifestEntries><!--manifest文件中的款项配置-->
                        <Class-Path>xxx</Class-Path>
                    </manifestEntries>
                    </transformer>
                </transformers>
                <!-- 以下排除依赖包中的*.SF *.DSA *.RSA文件,避免运行jar包时报告关于signature不匹配的安全问题 -->
                <filters>
                    <filter>
                        <artifact>*:*</artifact>
                        <excludes>
                           <exclude>META-INF/*.SF</exclude>
                            <exclude>META-INF/*.DSA</exclude>
                            <exclude>META-INF/*.RSA</exclude>
                        </excludes>
                    </filter>
                </filters>
            </configuration>
        </execution>
    </executions>
</plugin>

原文地址:https://www.cnblogs.com/xmaples/p/10442565.html

时间: 2024-11-10 13:27:44

maven——项目构建和依赖管理工具的相关文章

Maven01——简介、安装配置、入门程序、项目构建和依赖管理

1 Maven的简介 1.1 什么是maven 是apache下的一个开源项目,是纯java开发,并且只是用来管理java项目的 Svn eclipse   maven量级 1.2 Maven好处 同一个项目,普通的传统项目(24M)而Maven项目只需要(724KB) 分析:maven项目为什么这么小?没有jar. 需要jar吗?肯定需要.没有存在于maven项目里面,jar存在于哪? 1.3 依赖管理 1.4 项目一键构建 编码  编译  测试(junit)  运行  打包  部署 一个 t

Rust 之 cargo(项目构建和包管理工具)

如果食用cargo来进行项目构建: 1. 执行 cargo new hello_cargo --bin ,执行完上面的操作之后,我们切换到hell_cargo目录下,可以看到一个文件(Cargo.toml)和一个目录(src),同时src目录下有一个main.rs文件. 2. 执行 cargo run 就可以看到一行"hello world" 字符串出现在屏幕上

Maven——项目管理工具,可以对 Java 项目进行构建、依赖管理。

Maven是一个项目管理工具,它包含了一个项目对象模型 (Project Object Model),一组标准集合,一个项目生命周期(Project Lifecycle),一个依赖管理系统(Dependency Management System),和用来运行定义在生命周期阶段(phase)中插件(plugin)目标(goal)的逻辑.当你使用Maven的时候,你用一个明确定义的项目对象模型来描述你的项目,然后Maven可以应用横切的逻辑,这些逻辑来自一组共享的(或者自定义的)插件. Maven

maven项目构建

Maven是apache的一个开源项目.是一个用来把源代码构建成可发布的构件的工具. Maven的功能非常强大,可以认为是一个项目管理工具,不仅仅是一个构建工具. Maven本身的核心很小,但是可以在上面扩展出很多的插件.Mven采用的是插件的思想,通过插件的功能扩展出很多的功能.同时Maven采用约定大于配置的思想,在项目中采用了很多约定规则来减少配置.不想ant这样的构建工具需要很多的配置.作为一个项目构建工具,最重要的是管理项目的库和项目之间的依赖关系. 本文将以以下面的例子,来作为学习m

SpringMVC + Mybatis + SpringSecurity(权限控制到方法按钮) + Rest(服务) + Webservice(服务) + Quartz(定时调度)+ Lucene(搜索引擎) + HTML5 bootstrap + Maven项目构建绝对开源平台

框架整合: Springmvc + Mybatis + Shiro(权限) + REST(服务) + WebService(服务) + JMS(消息) + Lucene(搜搜引擎) + Quartz(定时调度) + Bootstrap Html5(支持PC.IOS.Android) 需要源码请加Q:3121026417   此处[源码获取地址] 框架简介: 项目Maven构建,真实大型互联网架构,做到高并发,大数据处理,整个项目使用定制化服务思想,提供模块化.服务化.原子化的方案,将功能模块进行

Php学习之依赖管理工具composer详解

本文和大家分享的主要是php中依赖管理工具composer相关用法,一起来看看吧,希望对大家学习php有所帮助. 什么是依赖管理工具 当你引用某个第三方库时,如果这个库使用到了另外一个或若干个第三方库,再或许另外一个第三方库又有其他的依赖,这样的话手动维护你需要下载安装N个包.用来解决由此产生的问题的工具就叫做依赖管理工具. 有哪些常见的依赖管理工具 Java的maven.gradle,NodeJs的npm,IOS的CocoaPods,PHP的composer 大部分编程语言都会有自己的常用依赖

JavaScript依赖管理工具bower

js依赖管理工具bower 注:本文摘自作者正在写的新书<云时代的程序猿> 2014.9.4 和前面介绍的maven类似,只不过它是专门用来管理js包的,在我们开发应用的时候,大部分情况下一个应用里会使用很多js的包,比如一个项目里可能会用到jquery.dwr.d3等多个js包,有的时候可能版本还不一样,如果每次都是手工下载,然后放到本地项目中,是不是觉得很无趣? bower就是来帮我们干这事的. 在安装bower之类请确保您已经安装了nodejs.npm管理工具及git. 安装bower:

Composer:PHP开发者必须了解的依赖管理工具

Composer是一个非常流行的PHP包依赖管理工具,已经取代PEAR包管理器,对于PHP开发者来说掌握Composer是必须的. 对于使用者来说Composer非常的简单,通过简单的一条命令将需要的代码包下载到vendor目录下,然后开发者就可以引入包并使用了. 其中的关键在于你项目定义的composer.json,可以定义项目需要依赖的包(可能有多个),而依赖的包可能又依赖其他的包(这就是组件的好处),这些都不用你烦心,Composer会自动下载你需要的一切,一切在于composer.jso

Golang官方依赖管理工具:dep

在这里声明一下,百度或者google看到的godep不是我这篇博文说的dep,那它们是什么关系呢?按照Peter Bourgon博文来说,它们的作者都有相同的人,但是一个是dep是官方版本,godep是第三方工具.我今天介绍的是dep,之前也有介绍过glide,有兴趣的可以到Golang依赖管理工具:glide从入门到精通使用看看. 现在还有一个疑问是为什么官方现在要支持依赖管理了呢?我个人认为有如下原因(勿喷,如果不同或者遗漏欢迎留言补充): 第三方依赖管理很多,虽然很好用,但是很少可以兼容的