技术标签: maven # 《maven实战》
经常在maven项目的pom文件中,看到这样的代码
<properties>
<spring.framework>4.0.4.RELEASE</spring.framework>
</properties>
<dependencies>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-core</artifactId>
<version>${spring.framework}</version>
</dependency>
</dependencies>
这段xml代码,先自定义了一个maven属性spring.framework
,然后${spring.framework}
的方式引用该maven属性的值。
maven完成依赖解析后,spring-core
依赖的版本为4.0.4.RELEASE
。
其实,这就是maven属性使用方式中的一种:先自定义maven属性,然后在其他地方以特定语法格式引用该属性的值
<!-- 自定义属性 -->
<property_name>property_value</property_name>
<!-- 引用方式 -->
${property_name}
${basedir}
和${version}
。
${basedir}
是maven项目的根目录,也就是pom.xml文件的父目录${version}
是maven项目的版本号,与${project.version}
等价我们知道在pom文件中有很多标签,大部分的标签都可以作为maven属性,被称作项目属性
项目属性,以project
为前缀,引用方式为${project.label_name}
例如,访问<artifactId>
标签的值,引用方式为${project.artifactId}
项目属性的分类如下:
项目属性归类 | 举例 |
---|---|
与项目坐标有关的 | ${project.groupId} 、${project.version} 、${project.packaging} 等,甚至可以引用父模块的项目属性:${project.parent.groupId} |
与项目文件目录有关的属性 | ${project.basedir} 、${project.build.directory} 等,一般都对应项目的target目录、target/classes目录等 |
settings
为前缀,引用方式为${settings.label_name}
<localRepository>
标签的值,引用方式为${settings.localRepository}
4.0.0
<properties>
标签自定义maven属性,然后以${property_name}
的形式引用System.getProperty()或System.setProperty()
进行访问与设置,也可以在Java命令行通过-Dproperty=value
进行传参${java_property_name}
进行访问${java_property_name}
进行访问,而无需单独赋值
config.properties文件,在文件中访问${runtime.version}
的值
runtime.version=${java.runtime.version}
在pom.xml中,开启资源过滤,这样就能将Java系统属性${java.runtime.version}
的值成功赋值给config.properties中的runtime.version
<build>
<resources>
<resource>
<directory>${project.basedir}/src/main/resources</directory>
<filtering>true</filtering>
</resource>
</resources>
</build>
编写代码,获取config.properties中属性的值
public static void main(String[] args) throws IOException {
InputStream resourceAsStream = Test.class.getClassLoader().getResourceAsStream("config.properties");
Properties properties = new Properties();
properties.load(resourceAsStream);
properties.forEach((x, y) -> System.out.printf("%s: %s\n", x, y));
}
使用mvn clean package -DskipTests
命令,生成jar包,然后执行jar。
执行结果如下,成功通过maven访问到Java系统属性
-Dproperty=value
为系统属性赋值,这与Java系统属性的赋值是一致的
app.env=${app.env}
mvn clean package -DskipTests -Dapp.env="sunrise dev"
" "
进行修饰JAVA_HOME
,这些环境变量也可以作为maven属性,被称为环境变量属性env
为前缀,引用方式为${env.variable_name
,例如:${env.PATH}
<profile>
定义的profile,可以通过profile id、activation定义的条件等,激活一个profile,从而可以访问profile中定义的若干属性需求描述:主资源目录下有一个config.prooperties
文件,其中的部分属性值会随dev、pre环境而变化,而user信息是固定
min.connection=${min.connection}
max.timeout=${max.timeout}
user.first.name=${user.first.name}
user.password=${user.password}
接着,在pom.xml中定义profile,按照dev、pre组织不同环境的值,并定义user属性组的值
<profiles>
<profile>
<id>dev</id>
<properties>
<min.connection>20</min.connection>
<max.timeout>10</max.timeout>
</properties>
</profile>
<profile>
<id>pre</id>
<properties>
<min.connection>50</min.connection>
<max.timeout>20</max.timeout>
</properties>
</profile>
<profile>
<id>user</id>
<properties>
<user.first.name>lucy</user.first.name>
<user.password>********</user.password>
</properties>
</profile>
</profiles>
然后,在pom.xml中开启资源过滤
<build>
<resources>
<resource>
<directory>${project.basedir}/src/main/resources</directory>
<filtering>true</filtering>
</resource>
</resources>
</build>
编写程序,获取config.prooperties中的属性值
public static void main(String[] args) throws IOException {
InputStream resourceAsStream = Test.class.getClassLoader().getResourceAsStream("config.properties");
Properties properties = new Properties();
properties.load(resourceAsStream);
properties.forEach((x, y) -> System.out.printf("%s: %s\n", x, y));
}
在编译时,通过-P
选项指定profile id,多个profile id之间使用,
分隔
mvn clean package -DskipTests -Ppre,user
# -P与profile id之间也可以存在空格
mvn clean package -DskipTests -P pre,user
执行jar包,打印结果如下,成功获取到pom.xml中定义的pre和user profile的值
-P
选项激活-P
选项激活profile<activeProfile>
激活<settings>
... <!-- 省略其他无关配置 -->
<activeProfiles>
<activeProfile>dev</activeProfile>
<activeProfile>user</activeProfile>
</activeProfiles>
</settings>
mvn clean package -DskipTests
生成jar包,执行jar包,发现成功获取dev和user的属性值profile id覆盖问题
-P
选项,将环境指定为pre,则setttings.xml的配置将会被覆盖高于
settings.xml中的activeProfile指定profile id的优先级<activation>
定义激活条件<activation>
标签,为每个profile定义激活条件通过<activation>
为dev这个profile配置激活条件:存在系统属性test时,激活dev profile
<profile>
<id>dev</id>
<properties>
<min.connection>20</min.connection>
<max.timeout>10</max.timeout>
</properties>
<activation>
<property>
<name>test</name>
</property>
</activation>
</profile>
config.properties文件定义如下:
min.connection=${min.connection}
max.timeout=${max.timeout}
执行maven命令时,通过-Dtest
去激活dev profile
若不指定-Dtest
,则无法激活dev profile,则打印出的config.properties中的property值为原始的字符串(无法编译替换)
甚至,还可以规定在系统属性值为期望值时,才激活profile。
例如下面的配置,执行maven命令时,通过-Dtest=10
激活dev profile
<profile>
<id>dev</id>
<properties>
<min.connection>20</min.connection>
<max.timeout>10</max.timeout>
</properties>
<activation>
<property>
<name>test</name>
<value>10</value>
</property>
</activation>
</profile>
<profiles>
<profile>
<activation>
<os>
<name>Windows XP</name>
<family>Windows</family>
<arch>x86</arch>
<version>5.1.2600</version>
</os>
</activation>
...
</profile>
将<activeByDefault>
设置为true,表示默认激活该profile
<activation>
<activeByDefault>true</activeByDefault>
</activation>
默认激活是级别最低的一种激活方式,一但使用了前面的激活方式激活profile,则默认激活配置会失效。
下面的profile定义中,dev和pre都有相同的属性值;dev profile默认为激活状态,但在执行maven命令时,通过-Ppre
激活了pre profile
<profiles>
<profile>
<id>pre</id>
<properties>
<min.connection>50</min.connection>
<max.timeout>20</max.timeout>
</properties>
</profile>
<profile>
<id>dev</id>
<properties>
<min.connection>20</min.connection>
<max.timeout>10</max.timeout>
</properties>
<activation>
<activeByDefault>true</activeByDefault>
</activation>
</profile>
</profiles>
最终,config.properties中的,将获取到pre profile中的属性值
.m2/settings.xml
,其中配置的profile对当前用户的maven项目有效conf/settings.xml
,其中配置的profile对本机所有的maven项目有效在web项目中往往存在这样的需求:某段文字的颜色需要随着业务变化而变化,这时也可以使用profile去实现
实现方式与上面的资源过滤一致,大致流程如下:
具体实现方式,可以查阅资料
在此简单记录,自己对Java web项目理解不是很深刻
文章浏览阅读2w次,点赞7次,收藏51次。四个步骤1.创建C++ Win32项目动态库dll 2.在Win32项目动态库中添加 外部依赖项 lib头文件和lib库3.导出C接口4.c#调用c++动态库开始你的表演...①创建一个空白的解决方案,在解决方案中添加 Visual C++ , Win32 项目空白解决方案的创建:添加Visual C++ , Win32 项目这......_c#调用lib
文章浏览阅读4.6k次。苹方字体是苹果系统上的黑体,挺好看的。注重颜值的网站都会使用,例如知乎:font-family: -apple-system, BlinkMacSystemFont, Helvetica Neue, PingFang SC, Microsoft YaHei, Source Han Sans SC, Noto Sans CJK SC, W..._ubuntu pingfang
文章浏览阅读159次。表单表单概述表单标签表单域按钮控件demo表单标签表单标签基本语法结构<form action="处理数据程序的url地址“ method=”get|post“ name="表单名称”></form><!--action,当提交表单时,向何处发送表单中的数据,地址可以是相对地址也可以是绝对地址--><!--method将表单中的数据传送给服务器处理,get方式直接显示在url地址中,数据可以被缓存,且长度有限制;而post方式数据隐藏传输,_html表单的处理程序有那些
文章浏览阅读1.2k次。使用说明:开启Google的登陆二步验证(即Google Authenticator服务)后用户登陆时需要输入额外由手机客户端生成的一次性密码。实现Google Authenticator功能需要服务器端和客户端的支持。服务器端负责密钥的生成、验证一次性密码是否正确。客户端记录密钥后生成一次性密码。下载谷歌验证类库文件放到项目合适位置(我这边放在项目Vender下面)https://github.com/PHPGangsta/GoogleAuthenticatorPHP代码示例://引入谷_php otp 验证器
文章浏览阅读4.3k次,点赞5次,收藏11次。matplotlib.plot画图横坐标混乱及间隔处理_matplotlib更改横轴间距
文章浏览阅读2.2k次。①Storage driver 处理各镜像层及容器层的处理细节,实现了多层数据的堆叠,为用户 提供了多层数据合并后的统一视图②所有 Storage driver 都使用可堆叠图像层和写时复制(CoW)策略③docker info 命令可查看当系统上的 storage driver主要用于测试目的,不建议用于生成环境。_docker 保存容器
文章浏览阅读834次,点赞27次,收藏13次。网络拓扑结构是指计算机网络中各组件(如计算机、服务器、打印机、路由器、交换机等设备)及其连接线路在物理布局或逻辑构型上的排列形式。这种布局不仅描述了设备间的实际物理连接方式,也决定了数据在网络中流动的路径和方式。不同的网络拓扑结构影响着网络的性能、可靠性、可扩展性及管理维护的难易程度。_网络拓扑csdn
文章浏览阅读1.8k次,点赞5次,收藏8次。IOS系统Date的坑要创建一个指定时间的new Date对象时,通常的做法是:new Date("2020-09-21 11:11:00")这行代码在 PC 端和安卓端都是正常的,而在 iOS 端则会提示 Invalid Date 无效日期。在IOS年月日中间的横岗许换成斜杠,也就是new Date("2020/09/21 11:11:00")通常为了兼容IOS的这个坑,需要做一些额外的特殊处理,笔者在开发的时候经常会忘了兼容IOS系统。所以就想试着重写Date函数,一劳永逸,避免每次ne_date.prototype 将所有 ios
文章浏览阅读5.3k次。方法一:用PLSQL Developer工具。 1 在PLSQL Developer的sql window里输入select * from test for update; 2 按F8执行 3 打开锁, 再按一下加号. 鼠标点到第一列的列头,使全列成选中状态,然后粘贴,最后commit提交即可。(前提..._excel导入pl/sql
文章浏览阅读83次。Git常用命令速查手册1、初始化仓库git init2、将文件添加到仓库git add 文件名 # 将工作区的某个文件添加到暂存区 git add -u # 添加所有被tracked文件中被修改或删除的文件信息到暂存区,不处理untracked的文件git add -A # 添加所有被tracked文件中被修改或删除的文件信息到暂存区,包括untracked的文件...
文章浏览阅读202次。分享119个ASP.NET源码总有一个是你想要的_千博二手车源码v2023 build 1120
文章浏览阅读1.8k次。版权声明:转载请注明出处 http://blog.csdn.net/irean_lau。目录(?)[+]1、缺省构造函数。2、缺省拷贝构造函数。3、 缺省析构函数。4、缺省赋值运算符。5、缺省取址运算符。6、 缺省取址运算符 const。[cpp] view plain copy_空类默认产生哪些类成员函数