scala
1 | <!-- properties --> |
example
1 | <project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" |
1 | <!-- properties --> |
1 | <project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" |
Apache Maven是一个软件项目管理和综合工具,基于项目对象模型(POM)的概念,Maven可以从一个中心资料片管理项目构建,报告和文件.
Maven主要目标是提供给开发人员:
Maven项目的结构和内容在一个XML文件中声明,pom.xml 项目对象模型(POM),这是整个Maven系统的基本单元.有关详细信息,请参阅Maven POM的部分.
Apache Maven 是一种创新的软件项目管理工具,提供了一个项目对象模型(POM)文件的新概念来管理项目的构建,相关性和文档.最强大的功能就是能够自动下载项目依赖库.
找到文件{M2_HOME}/conf/settings.xml
找到下列代码:
1 | <!-- proxies |
修改将上述代码,设置代理服务器
Maven的本地资源库是用来存储所有项目的依赖关系(插件jar和其他文件,这些文件被Maven下载)到本地文件夹.
找到文件{M2_HOME}/conf/settings.xml
修改如下代码:
1 | <settings><!-- localRepository |
当你建立一个 Maven 的项目,Maven 会检查你的 pom.xml 文件,以确定哪些依赖下载.首先,Maven 将从本地资源库获得 Maven 的本地资源库依赖资源,如果没有找到,然后把它会从默认的 Maven 中央存储库 查找下载.
Maven的依赖库查询顺序:
在 Maven 本地资源库中搜索,如果没有找到,进入第 2 步,否则退出
在 Maven 中央存储库搜索,如果没有找到,进入第 3 步,否则退出
在给定url的远程存储库搜索,如果没有找到,提示错误信息,否则退出
1 | <repositories> |
如果不注明version, maven将保持包是最新版本
将本地的jar包导入到Maven本地资源库(以kaptcha为例):
找到kaptcha jar包所在位置
使用mvn命令安装到本地资源库:
1 | mvn install:install-file -Dfile=c:\kaptcha-{version}.jar -DgroupId=com.google.code -DartifactId=kaptcha -Dversion={version} -Dpackaging=jar |
示例:
1 | D:\>mvn install:install-file -Dfile=c:\kaptcha-2.3.jar -DgroupId=com.google.code |
安装完毕后,就在pom.xml中声明kaptcha的坐标:
1 | <dependency> |
主要管理依赖的部署,目前scope可以有五个值:
Run as -> Maven install
Run as -> Maven build... -> clean tomcat7:run
解决访问WEB项目需要添加项目名称问题。
1 | <!-- 配置Tomcat插件 --> |
Maven项目实践。
1 | project-parent |
项目包含一个父项目,所有子模块parent指定为该项目。
项目版本定义在父项目中的properties中,变量名为revision,子模块版本使用${revision}
变量,并在父项目引用 flatten-maven-plugin
插件,更多可参考这里。这样,整个项目的版本号可通过revision变量来设置。
1 | <plugin> |
1 | <settings xmlns="http://maven.apache.org/SETTINGS/1.0.0" |
1 |
|
在很多场景下,需要将程序及依赖打包为单个 jar 包,方便部署、运行。打包成单体 jar 包,有多个插件可选,比如 maven-shade-plugin
、maven-assembly-plugin
。
以 gRPC 为例,我们有一个依赖包,里面自定义了 NameResolver。
1 | META-INF/services/io.grpc.NameResolverProvider |
如果我们恰巧引用了另外一个依赖包(jetcd-core),里面定义了其他的 NameResolver。
1 | META-INF/services/io.grpc.NameResolverProvider |
那么,在我们打包成单体 jar 时,将两个依赖包内的 META-INF/services/io.grpc.NameResolverProvider
合并为一个,这样打包后的程序在运行时才可以通过 SPI 机制,找到所有的扩展。
1 | 期望的打包后 META-INF/services/io.grpc.NameResolverProvider |
无论 maven-shade-plugin
还是 maven-assembly-plugin
,默认配置都不支持合并,需要单独配置。
对于 maven-shade-plugin
,需要添加 transformer。
1 | <transformer implementation="org.apache.maven.plugins.shade.resource.ServicesResourceTransformer"/> |
对于 maven-assembly-plugin
,需要添加组装描述文件 assembly.xml
,并启用 handler metaInf-services
。
1 | <!-- assembly.xml --> |
maven-shade-plugin
和 maven-assembly-plugin
配置,二选一。
1 | <plugin> |
1 | <plugin> |
assembly.xml
1 | <assembly xmlns="http://maven.apache.org/ASSEMBLY/2.1.0" |
./${filename}
」这样,不管是复制文件还是从剪切板复制图片,都会保存到文件同目录、同文件名下,引用的时候使用相对路径,这样,在上传到 git 仓库时,可以同步上传图片,并保持引用关系。
8.8.8.8
1 | localhost { |
1 | example.com { ... } # http 协议 |
原因是服务再返回请求设置 header 的 Location 字段时,没有把端口加进去,导致的现象是访问 http://doc.example.com:85
服务跳转到 http://doc.example.com/index
,由于端口丢失,导致无法访问。
从两个思路解决问题。
http://doc.example.com:85/index
)下面是 Caddy 的配置示例。
1 | header_down Location "^(http://doc.example.com)(.*)$" "$1:85$2" |
"^(http://doc.example.com)(.*)$"
, 匹配域名和 path"$1:85$2"
,在域名和 path 中间加端口下载插件 SwitchProxy,添加 charles 代理,并启用。
在 /etc/hosts
中添加 127.0.0.1 charles.prx
。
Map Remote
打开 iPhone 「设置 -> 无线局域网 -> 详情(已连接Wifi后的蓝色感叹号)-> 配置代理」,配置代理,ip 为开启 charles 的电脑 ip,port 为 charles 启动的代理端口,默认为 8888。
打开「Charles -> Help 」
会有如下提示。
在 safari 中访问网址 chls.pro/ssl
,允许下载证书,成功后会提示去设置中安装描述符。
打开「设置 -> 通用 -> 描述文件 -> Charles Proxy CA」,安装证书。
最后一步,启用证书。打开「设置 -> 通用 -> 关于手机 -> 证书信任设置 -> Charles Proxy CA」,启用它。
安装
使用清华开源站仓库安装参考这里。
1 | /bin/bash -c "$(curl -fsSL https://raw.githubusercontent.com/Homebrew/install/HEAD/install.sh)" |
卸载
1 | /bin/bash -c "$(curl -fsSL https://raw.githubusercontent.com/Homebrew/install/HEAD/install.sh)" |
1 | brew tap homebrew/cask-versions |
1 | openjdk |
管理多个版本 jdk 参考这里。
1 | 安装 jenv |