Maven-Scope

compile(编译范围)默认就是compile,什么都不配置也就是意味着compile。compile表示被依赖项目需要参与当前项目的编译,当然后续的测试,运行周期也参与其中,是一个比较强的依赖。打包的时候通常需要包含进去。 test(测试范围)表示依赖项目仅仅参与测试相关的工作,包括测试代码的编译,执行。比较典型的如junit。 runntime(运行时范围)表示被依赖项目无需参与项目的编译,不过后期的测试和运行周期需要其参与。与compile相比,跳过编译而已, 说实话在终端的项目(非开源,企业内部系统)中,和compile区别不是很大。比较常见的如JSR×××的实现,对应的API jar是compile的, 具体实现是runtime的,compile只需要知道接口就足够了。Oracle jdbc驱动架包就是一个很好的例子,一般scope为runntime。 另外runntime的依赖通常和optional搭配使用,optional为true。我可以用A实现,也可以用B实现。 provided(已提供范围)表示打包的时候可以不用包进去,别的设施(Web Container)会提供。事实上该依赖理论上可以参与编译,测试,运行等周期。相当于compile,但是在打包阶段做了exclude的动作。 例如一个web 应用,可能在编译 classpath 中需要可用的Servlet API 来编译一个servlet,但是不会在打包好的WAR 中包含这个Servlet API; 这个Servlet API JAR 由应用服务器或者servlet 容器提供。已提供范围的依赖在编译classpath (不是运行时)可用。它们不是传递性的,也不会被打包。 system(系统范围)system范围依赖与provided 类似,但是必须显式的提供一个对于本地系统中JAR 文件的路径。这么做是为了允许基于本地对象编译, 而这些对象是系统类库的一部分。这样的构件应该是一直可用的,Maven 也不会在仓库中去寻找它。如果将一个依赖范围设置成系统范围,必须同时提供一个 systemPath 元素。注意该范围是不推荐使用的(应该一直尽量去从公共或定制的 Maven 仓库中引用依赖)。 依赖传递A–>B–>C 当前项目为A,A依赖于B,B依赖于C,当C的Scope是test或者provided时,C直接被丢弃,A不依赖C; 否则A依赖C,C的Scope继承于B的Scope。

June 26, 2020 · 1 min · jiezi

Maven-DependencyManagerment

在项目顶层的POM文件中,会看到dependencyManagement元素。通过它来管理jar包的版本,让子项目中引用一个依赖而不用显示的列出版本号。Maven会沿着父子层次向上走,直到找到一个拥有dependencyManagement元素的项目,然后它就会使用在这个dependencyManagement元素中指定的版本号。 dependencies即使在子项目中不写该依赖项,那么子项目仍然会从父项目中继承该依赖项(全部继承)dependencyManagement里只是声明依赖,并不实现引入,因此子项目需要显示的声明需要用的依赖。如果不在子项目中声明依赖,是不会从父项目中继承下来的;只有在子项目中写了该依赖项,并且没有指定具体版本,才会从父项目中继承该项,并且version和scope都读取自父pom;另外如果子项目中指定了版本号,那么会使用子项目中指定的jar版本。<dependencies>中的jar直接加到项目中,管理的是依赖关系(如果有父pom,子pom,则子pom中只能被动接受父类的版本);<dependencyManagement>主要管理版本,对于子类继承同一个父类是很有用的,集中管理依赖版本不添加依赖关系,对于其中定义的版本,子pom不一定要继承父pom所定义的版本。

June 26, 2020 · 1 min · jiezi

Maven多模块报错-If-you-want-an-embedded-database-H2-HSQL-or-Derby

情景一个Maven单模块项目改造为多模块项目后,发现报错: ***************************APPLICATION FAILED TO START *************************** Description: Failed to configure a DataSource: 'url' attribute is not specified and no embedded datasource could be configured. Reason: Failed to determine a suitable driver class Action: Consider the following: If you want an embedded database (H2, HSQL or Derby), please put it on the classpath. If you have database settings to be loaded from a particular profile you may need to activate it (no profiles are currently active). Process finished with exit code 1一种可行的解决方案如果是Maven多模块项目,查看IDEA右上角Edit Configurations -> Use classpath of module,此栏应为 包含程序入口的xxxApplication.java和application.yml的module: ...

June 21, 2020 · 1 min · jiezi

2020maven高级

笔记地址:https://img.zhugexuetang.com/...课件地址:https://img.zhugexuetang.com/...课程大纲:https://img.zhugexuetang.com/... maven依赖冲突的解决办法maven构建SSM项目

June 20, 2020 · 1 min · jiezi

maven打包提示Failed-to-execute-goal

这种一般就是测试用例执行出错导致的解决办法:1.使测试用例跑通,不报错2.不执行测试一是命令行 mvn clean package -Dmaven.test.skip=true二是写入pom文件 <plugin> <groupId>org.apache.maven.plugins</groupId> <artifactId>maven-surefire-plugin</artifactId> <version>2.18.1</version> <configuration> <skipTests>true</skipTests> </configuration> </plugin> PS:欢迎小伙伴加入我的技术交流QQ群 1057838553

June 18, 2020 · 1 min · jiezi

maven项目如何引入第三方JAR包

近期项目开发中使用到了第三方提供的OTP硬件,其官方同时提供了jar包。而我们当前的项目为标准的maven项目。如何在maven项目中引入第三方jar包呢? 带着问题去搜索能够找到一大把答案,stackoverflow的相关问题发表于9年前,最佳答案获取了1100多个赞。但由于时间过于久远,该方法经测试虽然在开发过程中可行,但项目一旦打包便会发生 类无法成功加载 的错误。 经测试以下方案无论是在开发中,还是在项目打包后,都可以成功的在maven项目引用jar包。 复制文件将第三方的jar包复制到项目的资源文件夹中,比如:src/main/resources/lib 添加本地仓库打开项止pom.xml文件,添加以下信息: <project>... <repositories> <repository> <id>local-maven-repository</id> <url>file://${basedir}/src/main/resources/lib/</url> <releases> <enabled>true</enabled> </releases> <snapshots> <enabled>true</enabled> </snapshots> </repository> </repositories>...</project>其中url中的${basedir}代表当前pom.xml文件所在的文件夹。${basedir}/src/main/resources/lib/即为存放第三方jar包的位置。 添加依赖打开pom.xml,添加第三方jar包依赖。比如: <dependency> <groupId>com.mengyunzhi.core</groupId> <artifactId>Share</artifactId> <version>1.0</version> </dependency>groupId填写第三方包的package名称;artifactId可以填写要引用的类名;version可以任意填写,但必须有。 至此便可以在项目中正常的使用该jar包提供的功能了。 作者信息:河北工业大学梦云智开发团队 潘杰

June 18, 2020 · 1 min · jiezi

这篇文章教会你把个人开发的jar包发布到maven中央仓库

作者:小傅哥博客:https://bugstack.cn - 原创系列专题案例 沉淀、分享、成长,让自己和他人都能有所收获!????前言介绍(19年12月)最近想基于Spring Boot做个开源共享项目,开发一个分布式任务DcsSchedule中间件可以把Schedule增强。那么遇到一个问题希望把Jar包发包到Maven中央仓库,这样需要使用的用户就可以直接引入。 发布准备 内容备注1申请Github帐号: https://github.com用于上传开源代码:https://github.com/fuzhengwei...2GPG生成密钥工具: https://gpg4win.org/download....在后续流程中下载安装生成密钥并上传置服务器,本文使用的服务器是:hkp://keyserver.ubuntu.com:803工单系统: https://issues.sonatype.org负责申请上传资格及完成第一次上传,后续更新不需要使用,相当于一个启动装置4构件仓库: https://oss.sonatype.org上传的jar包会先存放到这里,在这里进行 Release 后即可发布到maven中央仓库,也可以本地设置自动发布5镜像仓库: http://search.maven.org最终成功发布的jar可以在这里搜到6Maven仓库:https://mvnrepository.com经过几个小时耐心的等待会在Maven仓库中搜到7阿里云仓库:https://maven.aliyun.com阿里云的仓库会同步的快一些8个人域名:https://bugstack.cn这里主要用于工单资格验证(Add a TXT record to your DNS referencing this JIRA ticket: OSSRH-53637 (Fastest))跟着节奏1. 下载安装Gpg生成密钥我们需要一个GPG环境,用来对上传的文件进行加密和签名,保证你的jar包不被篡改 1991年,程序员Phil Zimmermann为了避开政府监视,开发了加密软件PGP。这个软件非常好用,迅速流传开来,成了许多程序员的必备工具。但是,它是商业软件,不能自由使用。所以,自由软件基金会决定,开发一个PGP的替代品,取名为GnuPG。这就是GPG的由来。下载地址:https://gpg4win.org/download.html下载完成后直接安装即可,比较傻瓜式安装很简单,记得选中文(如果你英文硬也可以不选)生成密钥(可以使用命令行生成,也可以直接在操作界面生成) 文件>新建密钥对(Ctrl+N) -- 创建个人 OpenPGP 密钥对 填写个人信息姓名和邮箱 并点击到 新建 填写密钥密码 将公钥上传到目录服务{如果上传失败,则通过:设置(S)->配置Kleopatra(C),修改 OpenPGP密钥服务器为:hkp://keyserver.ubuntu.com:80} 2. 工单系统帐号注册issues.sonatype1. 注册地址:https://issues.sonatype.org/s... 2. 创建工单 项目:Community Support - Open Source Project Repository Hosting概要:发布Jar的名称描述:非必填,最好描述清晰Group Id:org.itatack.middleware & 和你的域名有关系,因为后续需要使用域名验证Project URL:Github项目站点(https://github.com/fuzhengwei...SCM url:源码仓库(https://github.com/fuzhengwei...3. 配合人工审核当创建完工单后,会收到信息反馈(国外与我们有时间差,半夜的时候他们审核的更快); ```javaDo you own the domain itstack.org? If so, please verify ownership via one of the following methods:Add a TXT record to your DNS referencing this JIRA ticket: OSSRH-53637 (Fastest)Setup a redirect to your Github page (if it does not already exist)If you do not own this domain, please read:http://central.sonatype.org/pages/choosing-your-coordinates.htmlYou may also choose a groupId that reflects your project hosting, in this case, something like io.github.fuzhengwei or com.github.fuzhengweiWould you like to use a free managed security reporting service (recommended)?Put https://hackerone.com/central-security-project/reports/new as your project's security issue reporting URL. We'll take care of the rest.For more details on the Central Security Project, visit https://www.sonatype.com/central-security-project```![](https://imgconvert.csdnimg.cn/aHR0cHM6Ly91c2VyLWdvbGQtY2RuLnhpdHUuaW8vMjAxOS8xMi83LzE2ZWRmMGI3ZmZjYTAzZWM?x-oss-process=image/format,png)配置域名验证签名;TXT 指向问题域:https://issues.sonatype.org/b... ...

June 18, 2020 · 3 min · jiezi

Maven

Maven一.Maven简介1.1 何为mavenMaven可翻译为"知识的积累" or"专家",是一款成功的开源跨平台的项目管理工具,无论小型的开源类库项目,还是大型的企业级应用;无论传统的瀑布式开发,还是流行的敏捷模式,Maven都能大显身手.1.1.1 构建工具 我们一直在不停的寻找避免重复的方法,设计的重复,编码的重复,文档的重复,当然还有构建的重复.Maven最大化的消除了构建的重复,抽象了构建生命周期,并且为绝大部分的构建任务提供了已实现的插件,我们不需要再定义过程,甚至不需要去实现这些过程中的一些任务,只需要遵循Maven中的约定. 同时Maven帮助我们标准化构建过程,以前十个项目可能有十种构建方式,有了Maven后,所有项目的构建命令都是一直且简单的.因此Maven作为一个构建工具: 可以帮我们自动化构建,可以帮我们抽象构建过程提供构建任务是实现跨平台对外提供一直的操作接口1.1.2 不仅仅是构建工具 Maven不仅是构建工具,还是一个依赖管理工具和项目信息管理工具,提供中央仓库来帮忙我们自动下载构建,通过引入一套经纬机制来系统准确的定位每一个构建(artifact). 1.1.3 Maven 在Maven之前,有过程式的Make和Ant,开发者需要显示的指定每一个目标,以及完成该目标所需要执行的任务.针对每一个项目,开发者都需要重新编写这一过程,而其中就隐含着大量重复. 而Maven是声明式的,项目构建过程和过程各个阶段所需的工作都由插件实现,并且大部分插件都是现成的,开发者只需要声明项目的基本元素,Maven就执行内置的,完整的构建过程. 二.Maven的使用2.1 pom文件 Maven项目的核心是pom.xml,POM(Project Object Model,项目对象模型)定义了项目的基本信息,用于描述项目如何构建,声明项目依赖等. <modelVersion>4.0.0</modelVersion>:modelVersion指定了当前Pom模型的版本,固定为4.0.0<groupId>com.lsy</groupId>:groupId定义了项目属于哪个组,这个组往往和项目所在的组织和公司相关 <artifactId>hello-world</artifactId>:artifactId定义了当前Maven项目在组中唯一的ID <version>1.0-SNAPSHOT</version>:version指定了Hello World项目当前的版本,其中SNAPSHOT意为快照,说明该项目还处于开发中 <name>Maven Hello World Project</name>:name元素声明了一个对于用户更为友好的项目名称.非必须 当运行mvn clean compile命令:clean告诉Maven清理输出目录target/,compile告诉Maven编译项目主代码,从输出中看到Maven首先执行clean:clean任务,删除target/目录(默认情况下,Maven构建的所有输出都在target目录中,接着执行resources:resources任务(未定义项目资源),最后执行compiler:compile任务,将项目主代码编译至target/classes目录 其中clean:clean,resources:resources和compiler:compile对应了Maven插件及插件目标,比如clean:clean是clean插件的clean目标,compiler:compile是compiler插件的compile目标 2.2 测试 首先添加Junit依赖 <dependencies> <dependency> <groupId>junit</groupId> <artifactId>junit</artifactId> <version>4.7</version> <scope>test</scope> </dependency> <dependencies> 其中scope元素为依赖范围,若依赖范围为test则表示该依赖只对测试有效,如果不声明依赖范围,则默认是compile,表示该依赖对主代码和测试代码均有效 当运行mvn clean test命令,Maven实际执行的不止test任务,而是clean:clean,resources:resources,compiler:compile,resources:testResources以及compiler:testCompile,即在执行测试之前,会先自动执行项目资源处理,主代码编译,测试资源处理,测试代码编译等工作,这是Maven生命周期的一个特性. 由于Maven核心插件之一compiler插件默认支持Java1.3,因此需要配置插件支持Java1.8 <build> <plugins> <plugin> <groupId>org.apache.maven.plugins</groupId> <artifactId>maven-compiler-plugin</artifactId> ...

May 31, 2020 · 11 min · jiezi