旅游网站推荐排行榜,wordpress图片剪切,wordpress+提供下载功能,金麦建站官网[maven] scopes 管理 profile 测试覆盖率
这里将一些其他的特性和测试覆盖率#xff08;主要是 jacoco#xff09;
scopes
maven 的 scope 主要就是用来限制和管理依赖的传递性#xff0c;简单的说就是#xff0c;每一个 scope 都有其对应的特性…[maven] scopes 管理 profile 测试覆盖率
这里将一些其他的特性和测试覆盖率主要是 jacoco
scopes
maven 的 scope 主要就是用来限制和管理依赖的传递性简单的说就是每一个 scope 都有其对应的特性并且会决定依赖包在打包和运行时是否会被使用
这里主要谈论的差别是 compile classpath 和 runtime classpath前者是编译时存在的环境后者是运行时存在的环境。
总共有 6 个 scopes compile (default) 这个是默认的 scope这个 scope 下的依赖会被打包到代码的最终代码里它也代表着该依赖会被保存到 compile classpath 和 runtime classpath粗暴的理解就是打包好的 jar/war 文件会包含 runtime classpath 的代码 provided 这个 scope 代表着在部署时JDK 或者容器在运行时会提供该依赖所以在 compile classpath 可以找到这个依赖但是 runtime classpath 中不会 例子就是 tomcat 这种 servlet api编译时肯定是需要的但是部署时肯定环境里自己会启一个 servlet因此 runtime classpath 不需要包涵 runtime 这个 scope 意味着依赖在编译时不需要但是运行时需要比如说 JDBC driver test 顾名思义只需要用在编译和测试不会打包到最终的代码里 system 这个挺少用的因为一旦用它就代表着要用到 systemPath 相关也就会变得非常依赖于系统似的其可移植性变低 import 比较特殊的 scope用在 BOM 这种特殊的依赖主要用来管理其他依赖版本
目前来说从 central repo 上拉下来的 scope 还是比较准的比如说 junit 相关的 scope 就是 test不过这也可以按需修改。
项目管理
这里分为三个部分
依赖管理插件管理版本管理
主要应用场景都是对于依赖/插件的版本控制。重载版本的情况下越下层靠近执行项目的 pom的值会取代上层设置的值
依赖管理
这个主要是通过在父元素中实现 dependencyManagement这样子元素中就不用重新声明版本方便进行统一管理。
在父元素中定义 junit 的版本
?xml version1.0 encodingUTF-8?project xmlnshttp://maven.apache.org/POM/4.0.0 xmlns:xsihttp://www.w3.org/2001/XMLSchema-instance xsi:schemaLocationhttp://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsdmodelVersion4.0.0/modelVersiongroupIdcom.goldenaarcher.product/groupIdartifactIdproductparent/artifactIdversion1.0/versionpackagingpom/packagingnameproductparent/name!-- FIXME change it to the projects website --urlhttp://www.example.com/urldependencyManagementdependenciesdependencygroupIdjunit/groupIdartifactIdjunit/artifactIdversion4.11/versionscopetest/scope/dependency/dependencies/dependencyManagementmodulesmoduleproductservices/modulemoduleproductweb/module/modules
/project这个时候如果子项目中重新声明了版本eclipse 就会出现这样的报错 子项目中的 pom 荏苒需要按需定义使用的依赖只不过就可以跳过版本声明方便统一管理
插件管理
插件管理有个相似的 pluginManagement不过它需要被放到 build 下: buildpluginManagementpluginsplugingroupIdorg.apache.maven.plugins/groupIdartifactIdmaven-compiler-plugin/artifactIdversion3.8.0/versionconfigurationrelease17/release/configuration/plugin/plugins/pluginManagement/build同理子项目中也是需要声明同样的插件但是可以不用实现 version 和 conviguration
版本管理
除了直接将版本写到 version 中如果一些依赖如 spring 全家桶都需要使用同一个版本与其重复 cv也可以在 properties 中声明版本变量方便管理 propertiesjava.version17/java.versionjunit.version5.10.0/junit.version/propertiesdependencyManagementdependenciesdependencygroupIdorg.junit.jupiter/groupIdartifactIdjunit-jupiter-engine/artifactIdversion${junit.version}/versionscopetest/scope/dependency/dependencies/dependencyManagementbuildpluginManagementpluginsplugingroupIdorg.apache.maven.plugins/groupIdartifactIdmaven-compiler-plugin/artifactIdversion3.8.0/versionconfigurationrelease${java.version}/release/configuration/plugin/plugins/pluginManagement/buildprofiles
profile 是一些配置型的内容可以用来重写默认值。
maven 中也可以用不同的项目家在加载不同的配置文件祈祷方便管理的作用。
创建新项目
选择 quickstart 创建一个新的 demo 项目即可
创建配置文件
这里的 profile 和 main 同级新建 3 个案例即可
❯ tree src
src
├── main
│ ├── java
│ │ └── com
│ │ └── goldenaarcher
│ │ └── maven
│ │ └── profiledemo
│ │ └── App.java
│ └── profiles
│ ├── dev
│ │ └── application.properties
│ ├── prod
│ │ └── application.properties
│ └── test
│ └── application.properties
└── test└── java└── com└── goldenaarcher└── maven└── profiledemo└── AppTest.java里面的内容也很简单
❯ cat src/main/profiles/dev/application.properties
db.urldevurl
db.userNamedev
db.passworddev%其实 profiles 也可以放在其他地方我记得一个项目是放到 resources 里这点看项目习惯
配置 profile
profile 直接放在 xml 下即可 profilesprofileiddev/idpropertiesbuild.profile.iddev/build.profile.id/propertiesbuildresourcesresourcedirectorysrc/main/profiles/dev/directory/resource/resources/build/profileprofileidprod/idpropertiesbuild.profile.idprod/build.profile.id/propertiesbuildresourcesresourcedirectorysrc/main/profiles/prod/directory/resource/resources/build/profileprofileidtest/idpropertiesbuild.profile.idtest/build.profile.id/propertiesbuildresourcesresourcedirectorysrc/main/profiles/test/directory/resource/resources/build/profile/profiles只有一个 profile 的话不需要设置 id有一个以上不设置会报错
profile 使用案例
命令行执行 profile
语法为 mvn lifecycle-phase -Pprofile-name
如
❯ mvn install -Pdev
[INFO] Scanning for projects...
[INFO]
[INFO] ---------------- com.goldenaarcher.maven:profiledemo -----------------
[INFO] Building profiledemo 0.0.1-SNAPSHOT
[INFO] --------------------------------[ jar ]---------------------------------
[INFO]
[INFO] --- maven-resources-plugin:3.0.2:resources (default-resources) profiledemo ---
[INFO] Using UTF-8 encoding to copy filtered resources.
[INFO] Copying 1 resource
[INFO]
[INFO] --- maven-compiler-plugin:3.8.0:compile (default-compile) profiledemo ---
[INFO] Changes detected - recompiling the module!
[INFO] Compiling 1 source file to /Users/louhan/study/maven/profiledemo/target/classes
[INFO]
[INFO] --- maven-resources-plugin:3.0.2:testResources (default-testResources) profiledemo ---
[INFO] Using UTF-8 encoding to copy filtered resources.
[INFO] skip non existing resourceDirectory /Users/louhan/study/maven/profiledemo/src/test/resources
[INFO]
[INFO] --- maven-compiler-plugin:3.8.0:testCompile (default-testCompile) profiledemo ---
[INFO] Changes detected - recompiling the module!
[INFO] Compiling 1 source file to /Users/louhan/study/maven/profiledemo/target/test-classes
[INFO]
[INFO] --- maven-surefire-plugin:2.22.1:test (default-test) profiledemo ---
[INFO]
[INFO] -------------------------------------------------------
[INFO] T E S T S
[INFO] -------------------------------------------------------
[INFO] Running com.goldenaarcher.maven.profiledemo.AppTest
[INFO] Tests run: 1, Failures: 0, Errors: 0, Skipped: 0, Time elapsed: 0.022 s - in com.goldenaarcher.maven.profiledemo.AppTest
[INFO]
[INFO] Results:
[INFO]
[INFO] Tests run: 1, Failures: 0, Errors: 0, Skipped: 0
[INFO]
[INFO]
[INFO] --- maven-jar-plugin:3.0.2:jar (default-jar) profiledemo ---
[INFO] Building jar: /Users/louhan/study/maven/profiledemo/target/profiledemo-0.0.1-SNAPSHOT.jar
[INFO]
[INFO] --- maven-install-plugin:2.5.2:install (default-install) profiledemo ---
[INFO] Installing /Users/louhan/study/maven/profiledemo/target/profiledemo-0.0.1-SNAPSHOT.jar to /Users/louhan/.m2/repository/com/goldenaarcher/maven/profiledemo/0.0.1-SNAPSHOT/profiledemo-0.0.1-SNAPSHOT.jar
[INFO] Installing /Users/louhan/study/maven/profiledemo/pom.xml to /Users/louhan/.m2/repository/com/goldenaarcher/maven/profiledemo/0.0.1-SNAPSHOT/profiledemo-0.0.1-SNAPSHOT.pom
[INFO] ------------------------------------------------------------------------
[INFO] BUILD SUCCESS
[INFO] ------------------------------------------------------------------------
[INFO] Total time: 2.714 s
[INFO] Finished at: 2023-09-14T22:44:31-04:00
[INFO] ------------------------------------------------------------------------如果解压打包好的 jar 文件就能看到里面的 application.properties 内容如下
❯ cat target/profiledemo-0.0.1-SNAPSHOT/application.properties
db.urldevurl
db.userNamedev
db.passworddev%eclipse 中设置
这个在 project properties 修改就行 jacoco 代码覆盖率
sonarqube 执行失败
jacoco
修改 pom buildpluginsplugingroupIdorg.jacoco/groupIdartifactIdjacoco-maven-plugin/artifactIdversion0.8.7/versionexecutionsexecutiongoalsgoalprepare-agent/goal/goals/executionexecutionidreport/idphasetest/phasegoalsgoalreport/goal/goals/execution/executions/plugin/plugins/build这个 plugin 放到 pluginManagement 下管理会报错但是拉出来直接放到 build 下就好了原因未明从 Stack Overflow 上找到的解决方法maven jacoco: not generating code coverage report
简单的过一遍 xml 的配置goal 在 [maven] maven 简述及使用 maven 管理单个项目 提过了execution 没有。
goal 是 plugin 提供的这里只是负责调用。
execution 是用来配置 goal 应该在哪个 phase 中执行这里有两个 execution第一个 goal 就是 jacoco 提供的 prepare-agent其他忽略代表着会从头开始执行。
第二个 execution 指定的是生成报告的阶段生成测试报告的 phase 应该是测试所以就是在测试这个 phase 执行 report 这个 goal。
运行结果:
# 这里需要用verify不能用testtest会跳过report
❯ mvn clean verify
[INFO] Scanning for projects...
[INFO]
[INFO] ------------- com.goldenaarcher.product:productservices --------------
[INFO] Building productservices 1.0
[INFO] --------------------------------[ jar ]---------------------------------
[INFO]
[INFO] --- maven-clean-plugin:3.1.0:clean (default-clean) productservices ---
[INFO] Deleting /Users/louhan/study/maven/parent/productservices/target
[INFO]
[INFO] --- jacoco-maven-plugin:0.8.7:prepare-agent (default) productservices ---
[INFO] argLine set to -javaagent:/Users/louhan/.m2/repository/org/jacoco/org.jacoco.agent/0.8.7/org.jacoco.agent-0.8.7-runtime.jardestfile/Users/louhan/study/maven/parent/productservices/target/jacoco.exec
[INFO]
[INFO] --- maven-resources-plugin:3.0.2:resources (default-resources) productservices ---
[WARNING] Using platform encoding (UTF-8 actually) to copy filtered resources, i.e. build is platform dependent!
[INFO] skip non existing resourceDirectory /Users/louhan/study/maven/parent/productservices/src/main/resources
[INFO]
[INFO] --- maven-compiler-plugin:3.8.0:compile (default-compile) productservices ---
[INFO] Changes detected - recompiling the module!
[WARNING] File encoding has not been set, using platform encoding UTF-8, i.e. build is platform dependent!
[INFO] Compiling 5 source files to /Users/louhan/study/maven/parent/productservices/target/classes
[INFO]
[INFO] --- maven-resources-plugin:3.0.2:testResources (default-testResources) productservices ---
[WARNING] Using platform encoding (UTF-8 actually) to copy filtered resources, i.e. build is platform dependent!
[INFO] skip non existing resourceDirectory /Users/louhan/study/maven/parent/productservices/src/test/resources
[INFO]
[INFO] --- maven-compiler-plugin:3.8.0:testCompile (default-testCompile) productservices ---
[INFO] Changes detected - recompiling the module!
[WARNING] File encoding has not been set, using platform encoding UTF-8, i.e. build is platform dependent!
[INFO] Compiling 1 source file to /Users/louhan/study/maven/parent/productservices/target/test-classes
[INFO]
[INFO] --- maven-surefire-plugin:2.22.1:test (default-test) productservices ---
[INFO]
[INFO] -------------------------------------------------------
[INFO] T E S T S
[INFO] -------------------------------------------------------
[INFO] Running com.goldenaarcher.product.dao.ProductDAOImplTest
[INFO] Tests run: 1, Failures: 0, Errors: 0, Skipped: 0, Time elapsed: 0.07 s - in com.goldenaarcher.product.dao.ProductDAOImplTest
[INFO]
[INFO] Results:
[INFO]
[INFO] Tests run: 1, Failures: 0, Errors: 0, Skipped: 0
[INFO]
[INFO]
[INFO] --- jacoco-maven-plugin:0.8.7:report (report) productservices ---
[INFO] Loading execution data file /Users/louhan/study/maven/parent/productservices/target/jacoco.exec
[INFO] Analyzed bundle productservices with 3 classes
[INFO]
[INFO] --- maven-jar-plugin:3.0.2:jar (default-jar) productservices ---
[INFO] Building jar: /Users/louhan/study/maven/parent/productservices/target/productservices-1.0.jar
[INFO] ------------------------------------------------------------------------
[INFO] BUILD SUCCESS
[INFO] ------------------------------------------------------------------------
[INFO] Total time: 4.440 s
[INFO] Finished at: 2023-09-15T00:01:59-04:00
[INFO] ------------------------------------------------------------------------可以看到运行到测试这里jacoco 的 goal 被执行了jacoco-maven-plugin:0.8.7:report (report) productservices最终生成报告的目录与结果
❯ tree target/site
target/site
└── jacoco├── com.goldenaarcher.product.bo│ ├── ProductBOImpl.html│ ├── ProductBOImpl.java.html│ ├── index.html│ └── index.source.html├── com.goldenaarcher.product.dao│ ├── ProductDAOImpl.html│ ├── ProductDAOImpl.java.html│ ├── index.html│ └── index.source.html├── com.goldenaarcher.product.dto│ ├── Product.html│ ├── Product.java.html│ ├── index.html│ └── index.source.html├── index.html├── jacoco-resources│ ├── branchfc.gif│ ├── branchnc.gif│ ├── branchpc.gif│ ├── bundle.gif│ ├── class.gif│ ├── down.gif│ ├── greenbar.gif│ ├── group.gif│ ├── method.gif│ ├── package.gif│ ├── prettify.css│ ├── prettify.js│ ├── redbar.gif│ ├── report.css│ ├── report.gif│ ├── session.gif│ ├── sort.gif│ ├── sort.js│ ├── source.gif│ └── up.gif├── jacoco-sessions.html├── jacoco.csv└── jacoco.xml6 directories, 36 filessonarqube
sonarqube 也是一个挺好用的代码测试工具不过它需要修改本机 proxy并启动一个本地服务器去执行剩下的操作很不幸的是工作机的 proxy 没法改所以这里就……
它的运行方式还是挺简单的sonarqube 提供了 sh/bat 文件直接运行就能启动服务器登陆后在 dashboard 生成一串登陆编号maven 运行时添加登录编号 sonarqube 就可以对其进行分析属于不太要修改 maven 配置的工具