亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb

首頁 > 學院 > 開發設計 > 正文

Maven學習-處理資源文件

2019-11-14 15:24:53
字體:
來源:轉載
供稿:網友

在前面兩篇文章中,我們學習了Maven的基本使用方式和Maven項目的標準目錄結構。接下來,我們來看下Maven是如果管理項目中的資源文件的。

java項目的資源文件,主要用于存儲系統的配置信息,以及提供系統集成的配置文件。項目中的資源文件夾下一般都存儲了以.PRoperties為后綴的文件以及.xml為后綴的文件,用于記錄系統的上下文關系、log以及jdbc相關的配置信息。

為Jar包添加資源文件

在我們使用POM管理項目的時候,我們在進行打包的時候,需要將項目中的資源文件一起打包到最終的jar包中。所以,我們需要將那些資源文件放置在Maven可以識別的目錄下。

在前一篇介紹Maven目錄結構的文章中,我們提到了在Maven的項目目錄下,有一個默認的目錄用于存放項目的資源文件:${basedir}/src/main/resources。所有存放在這個目錄下的資源文件,當Maven進行打包的時候,就會將該目錄下的資源文件一起打包到jar包中。Maven打包的時候,會按照該${basedir}/src/main/resources目錄下資源文件組織的目錄結構,在jar包的根目錄下也會有相同的目錄層次結構。

比如:

my-app|-- pom.xml`-- src    |-- main    |   |-- java    |   |   `-- com    |   |       `-- mycompany    |   |           `-- app    |   |               `-- App.java    |   `-- resources    |       `-- META-INF    |           `-- application.properties    `-- test        `-- java            `-- com                `-- mycompany                    `-- app                        `-- APPTest.java

上面的項目打包成jar包以后,jar包中的目錄結構如下所示:

|-- META-INF|   |-- MANIFEST.MF|   |-- application.properties|   `-- maven|       `-- com.mycompany.app|           `-- my-app|               |-- pom.properties|               `-- pom.xml`-- com    `-- mycompany        `-- app            `-- App.class

我們可以看到,資源文件application.properties在我們的項目中是在META-INFO目錄下,而打包以后,該文件仍舊是在該目錄下,而META-INFO目錄是存放在jar包的根目錄下的。

上面我們只是介紹了我們項目中系統需要的資源文件的存放位置,對于項目中的單元測試,也可以由一套自己的資源文件。這些資源文件存放的目錄結構和上面的類似,只不過存放的目錄名不同。單元測試相關的資源文件存放在${basedir}/src/test/resources目錄下,和前面的目錄對比,我們可以發現,區別只是src目錄下的main目錄和test目錄而已。這也是為什么測試相關的代碼和資源都是在test目錄下,而系統相關的代碼和資源都存放在main目錄下,這樣可以方便識別。

我們可以看下一個包含單元測試資源文件的目錄結構:

my-app|-- pom.xml`-- src    |-- main    |   |-- java    |   |   `-- com    |   |       `-- mycompany    |   |           `-- app    |   |               `-- App.java    |   `-- resources    |       `-- META-INF    |           |-- application.properties    `-- test        |-- java        |   `-- com        |       `-- mycompany        |           `-- app        |               `-- AppTest.java        `-- resources            `-- test.properties

如果我們需要在Java代碼中訪問項目的資源文件,比如上面的test.properties文件,我們只需要書寫類似下面的代碼:

InputStream is = getClass().getResourceAsStream( "/test.properties" );

我們在寫代碼讀取資源文件時,定位資源文件的位置的時候,需要參考實際該資源文件最終在jar包中存放的位置,而不是項目中的位置。按照上面提到的,在jar包中,是按照項目的resources目錄下的目錄結構,在jar包的根目錄下產生相同的目錄結構的。對于上面的test.properties文件,在jar包中就是存放在jar包的根目錄下,所以我們可以在代碼中直接這么定位該文件的位置"/test.properties"。

現在,我們已經知道了Maven是如何管理資源文件的了。接下來,我們來看下Maven提供的一種處理資源文件的機制,可以很方便的配置項目的資源。

過濾資源文件

有時候,我們的資源文件中設置的值,只能在構建項目的時候才會被指定。為了完成這個需求,在Maven中可以為這個需要在構建的時候才可以確定值的位置,放置一個占位符,來表示這個未來會被設置的值。通過使用${property}的方式指定。其中property可以是指定在pom.xml文件中的值,或者是在setting.xml文件中設置的值,或者是放在項目的filters目錄(參考Maven的項目目錄結構)下的外部的properties文件中的值,亦或是一個系統屬性。這種方式在Maven中稱為對資源文件的過濾。

為了使得Maven在將資源文件打包時對一個資源文件進行過濾處理,可以在pom.xml中設置filtering元素的值為true。

比如下面的例子:

<project xmlns="http://maven.apache.org/POM/4.0.0"  xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"  xsi:schemaLocation="http://maven.apache.org/POM/4.0.0                      http://maven.apache.org/xsd/maven-4.0.0.xsd">  <modelVersion>4.0.0</modelVersion>   <groupId>com.mycompany.app</groupId>  <artifactId>my-app</artifactId>  <version>1.0-SNAPSHOT</version>  <packaging>jar</packaging>   <name>Maven Quick Start Archetype</name>  <url>http://maven.apache.org</url>  ...   <build>    <resources>      <resource>        <directory>src/main/resources</directory>        <filtering>true</filtering>      </resource>    </resources>  </build></project>

在上面的例子中,我們在pom.xml文件中添加了一個<build>...</build>元素,在這個<build>元素中,我們定義了<resources>元素來指定資源相關的配置,在<resources>元素下的<resource>元素中,我們可以指定哪個資源文件需要Maven進行過濾處理。在這里,我們通過<directory>元素指定了需要被Maven進行過濾的資源文件目錄為src/main/resources。<filtering>元素指定這個資源目錄是否需要被Maven進行過濾處理,默認是false,表示不進行處理。

當我們需要引用定義在pom.xml的文件中屬性的時候,引用的屬性的名字使用定義這個屬性的XML元素的名字。使用pom前綴表示項目根元素的別名。比如,${pom.name}引用定義在pom.xml文件中的項目的名字,${pom.version}引用項目的版本,${pom.build.finalName}引用項目的finalName(finalName是項目最終被打包以后的名字)。類似的,如果是引用定義在setting.xml文件中的名字,可以使用${setting.localRepository}名字來引用,引用的時候需要加上setting前綴。

下面是一個使用Maven資源過濾的一個例子:

假設我們有一個application.properties文件,放在目錄src/main/resources下,文件中的內容如下:

application.name=${pom.name}application.version=${pom.version}

然后,我們執行下面的命令來處理資源文件:

$ mvn process-resources

process-resources命令會復制項目中的資源文件到目錄target/classes中,并進行過濾處理。

運行完以后,我們可以看到application.properties文件已經被實際的屬性值替換了:

application.name=Maven Quick Start Archetypeapplication.version=1.0-SNAPSHOT

接下來,我們來看下怎樣引用定義在外部的properties文件中的值。首先,我們在Maven項目的的/src/main/filters目錄下添加一個properties文件filter.properties,我們在文件中定義一個屬性鍵-值對:

my.filter.value=test

接下來,為了讓Maven可以知道這個文件的存在,我們需要在pom.xml中引用這個文件:

<project xmlns="http://maven.apache.org/POM/4.0.0"  xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"  xsi:schemaLocation="http://maven.apache.org/POM/4.0.0                      http://maven.apache.org/xsd/maven-4.0.0.xsd">  <modelVersion>4.0.0</modelVersion>   <groupId>com.mycompany.app</groupId>  <artifactId>my-app</artifactId>  <version>1.0-SNAPSHOT</version>  <packaging>jar</packaging>   <name>Maven Quick Start Archetype</name>  <url>http://maven.apache.org</url>  ....   <build>    <filters>      <filter>src/main/filters/filter.properties</filter>    </filters>    <resources>      <resource>        <directory>src/main/resources</directory>        <filtering>true</filtering>      </resource>    </resources>  </build></project>

在上面的pom.xml文件中,有一條定義在<filters>元素中的語句<filter>src/main/filters/filter.properties</filter>,指定了這個外部properties文件來對資源文件進行過濾處理。如果存在多個可以用于過濾的外部properties文件,可以定義多個<filter>元素來指定。

下面,我們在原來的application.properties文件中添加一條屬性來引用外部properties文件中的my.filter.value的值:

application.name=${pom.name}application.version=${pom.version}message=${my.filter.value}

然后當我們執行mvn process-resources命令的時候,會使用外部properties文件中的值來替換application.properties文件中的message屬性的${my.filter.value}的值了。

除了我們使用外部properties文件來實現上面的效果之外,我們也可以使用另外一種方式來達到上面一樣的效果。只需要在pom.xml文件中定義<properties></properties>元素來定義我們需要過濾的屬性,比如上面的my.filter.value屬性:

<project xmlns="http://maven.apache.org/POM/4.0.0"  xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"  xsi:schemaLocation="http://maven.apache.org/POM/4.0.0                      http://maven.apache.org/xsd/maven-4.0.0.xsd">  <modelVersion>4.0.0</modelVersion>   <groupId>com.mycompany.app</groupId>  <artifactId>my-app</artifactId>  <version>1.0-SNAPSHOT</version>  <packaging>jar</packaging>   <name>Maven Quick Start Archetype</name>  <url>http://maven.apache.org</url>  ...   <build>    <resources>      <resource>        <directory>src/main/resources</directory>        <filtering>true</filtering>      </resource>    </resources>  </build>   <properties>    <my.filter.value>test</my.filter.value>  </properties></project>

上面的pom.xml文件中,我們在<properties></properties>元素中定義了一個名為<my.filter.value>的元素,這樣,我們就可以在資源文件中直接引用這個元素中定義的屬性值了。達到和上面使用外部properties文件一樣的效果。

下面,我們看下如何獲得系統級別的屬性吧。

被Maven過濾的資源文件,可以獲得系統級別的屬性,以及Java內建的屬性,比如java.versionjava.home。我們也可以獲得命令行下傳遞過來的屬性值,通過-D選項來指定:

我們修改之前的application.properties文件,添加以下的內容:

java.version=${java.version}command.line.prop=${command.line.prop}

現在,我們執行下面的命令:

$ mvn process-resources "-Dcommand.line.prop=hello world"

上面的命令,在命令行上通過-D選項指定了一個屬性值,所以我們在過濾資源文件的時候會獲得這個值,并進行替換。

執行以后,在target/classes目錄下的application.properties文件中,會變成這樣:

java.version=1.7.0_79command.line.prop=hello world

好了,到這里,我們已經把Maven對資源文件過濾的內容介紹的差不多了。接下來,我們來看一個使用Maven資源文件過濾的實際例子:

現在我們有這樣一個問題,我們在開發過程中需要多套配置數據來配置開發環境,比如數據庫地址的配置等信息。我們需要在多個開發情景下進行切換,如果我們將配置信息寫死在資源文件中,那么在我們切換的時候,會比較繁瑣,還可能出現拼寫錯誤,特別是涉及到ip地址的修改的時候。所以,我們可以定義兩套配置方案,通過Maven的資源過濾機制,可以很方便的進行切換。

首先,假設我們有開發和測試兩個開發情景,那么,我們可以定義兩個對應的properties文件:dev-filter.propertiestest-filter.properties。把這兩個文件放在項目的filters目錄下,作為外部properties文件。

兩個文件的定義如下:

# dev-filter.propertiesdb.url=192.168.31.101# test-filter.propertiesdb.url=192.168.32.102

現在,加上我們的數據庫連接的配置是放在jdbc.properties這個資源文件中:

jdbc.url=${db.url}

那么,我們需要在pom.xml中指定需要被過濾的資源文件,以及外部的properties文件:

<project xmlns="http://maven.apache.org/POM/4.0.0"  xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"  xsi:schemaLocation="http://maven.apache.org/POM/4.0.0                      http://maven.apache.org/xsd/maven-4.0.0.xsd">  <modelVersion>4.0.0</modelVersion>   <groupId>com.mycompany.app</groupId>  <artifactId>my-app</artifactId>  <version>1.0-SNAPSHOT</version>  <packaging>jar</packaging>   <name>Maven Quick Start Archetype</name>  <url>http://maven.apache.org</url>  ....   <build>    <filters>      <filter>src/main/filters/filter-${env}.properties</filter>    </filters>    <resources>      <resource>        <directory>src/main/resources</directory>        <filtering>true</filtering>      </resource>    </resources>  </build></project>

現在,我們只是可以對jdbc.properties這個資源文件進行過濾了,但是,我們注意到,在上面的pom.xml文件中,在定義外部properties文件的時候,使用了一個名為${env}的變量,所以,我們接下來要定義這個env變量,來實現不同開發情景的切換。我們使用了Maven的profile來實現:

<profiles>   <!-- 開發環境,默認激活 -->    <profile>        <id>dev</id>        <properties>            <env>dev</env>        </properties>        <activation>            <activeByDefault>true</activeByDefault>        </activation>    </profile>    <!-- 測試環境 -->    <profile>        <id>test</id>        <properties>            <env>test</env>        </properties>    </profile></profiles>

上面的代碼中定義了變量env,將上面的代碼放到pom.xml文件中,就可以實現開發環境和測試環境的切換了。

我們可以用下面的命令來進行切換:

$ mvn clean package -Pdev   # 將Maven切換到開發情景$ mvn clean package -Ptest  # 將Maven切換到測試情景

好了,對Maven的資源的處理,就介紹到這里。如果您覺得文章寫的還行,不妨動動您的鼠標,點個贊吧~

引用

https://maven.apache.org/guides/getting-started/index.html


發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb
日韩专区中文字幕| 亚洲人成网站在线播| 欧美激情xxxxx| 国产婷婷色综合av蜜臀av| 91亚洲精品久久久| 日韩大片免费观看视频播放| 91亚洲精品一区| 国产日韩在线视频| 日本精品一区二区三区在线播放视频| 91九色国产视频| 国产精品美腿一区在线看| 日韩av在线高清| 91精品91久久久久久| 亚洲成人激情视频| 日韩精品中文字幕视频在线| 欧美国产日本在线| 欧美视频一二三| 日韩a**中文字幕| 97超级碰碰人国产在线观看| 一级做a爰片久久毛片美女图片| 中文字幕最新精品| 91精品国产高清自在线看超| 国产精品网红直播| 亚洲毛片在线观看| 欧美一级视频一区二区| 国产亚洲精品久久久久久牛牛| 国产97色在线| 国产精品久久9| 日韩精品免费在线观看| 日韩精品视频免费在线观看| 久久久精品日本| 亚洲午夜色婷婷在线| 激情成人中文字幕| 亚洲片国产一区一级在线观看| 色综合老司机第九色激情| 欧美日韩中国免费专区在线看| 91国内揄拍国内精品对白| 色综久久综合桃花网| 欧美一区二区三区免费观看| 国产精品嫩草影院一区二区| 亚洲人免费视频| 亚洲国产欧美久久| 色多多国产成人永久免费网站| 91精品国产综合久久香蕉922| 日韩在线观看免费av| 国产欧美在线观看| 黄色成人av在线| 亚洲美女在线视频| 国产精品盗摄久久久| 欧美在线不卡区| 国产成人免费91av在线| 久久中文字幕国产| 一区二区三区视频免费在线观看| 欧美亚洲第一区| 国产精品亚洲激情| 日本伊人精品一区二区三区介绍| 美女福利精品视频| 欧美性一区二区三区| 国产精品免费福利| 欧美资源在线观看| 亚洲欧洲偷拍精品| 91最新国产视频| 激情懂色av一区av二区av| 岛国av一区二区在线在线观看| 久久久伊人日本| 欧美一级高清免费| 琪琪亚洲精品午夜在线| 亚洲精品国产精品乱码不99按摩| 国产脚交av在线一区二区| 伦伦影院午夜日韩欧美限制| 国产精品成人国产乱一区| 中文字幕亚洲一区在线观看| 国产一区二区黄| 亚洲a∨日韩av高清在线观看| 久久伊人色综合| 国产亚洲欧美aaaa| 欧美国产一区二区三区| 国产成人免费av| 黑人与娇小精品av专区| 久久久久国产一区二区三区| 亚洲女人初尝黑人巨大| 国产精品入口夜色视频大尺度| 久久久久久久电影一区| 国产精品www色诱视频| 亚洲最大福利视频| 欧美性20hd另类| 国产又爽又黄的激情精品视频| 奇米影视亚洲狠狠色| 亚洲精品资源美女情侣酒店| 国产aⅴ夜夜欢一区二区三区| 亚洲伊人久久综合| 国产精品露脸av在线| 日韩av一区二区在线| 精品视频一区在线视频| 亚洲欧美精品伊人久久| 97色在线观看免费视频| 免费99精品国产自在在线| 亚洲一区二区三区xxx视频| 国产精品青草久久久久福利99| 久久偷看各类女兵18女厕嘘嘘| 欧美性受xxxx白人性爽| 亚洲欧美日韩在线高清直播| 欧美日本在线视频中文字字幕| 国产精品网站大全| 精品视频久久久久久久| 狠狠色香婷婷久久亚洲精品| 日韩精品免费电影| 红桃av永久久久| 国产精品爱啪在线线免费观看| 国语自产精品视频在线看一大j8| 96sao精品视频在线观看| 中文日韩在线视频| 亚洲国产精品美女| 亚洲黄色片网站| 高清一区二区三区日本久| 亚洲成人黄色网址| 欧美第一黄网免费网站| 日韩欧美成人精品| 亚洲国产精品电影| 美女视频黄免费的亚洲男人天堂| 日韩中文字幕在线观看| 一区二区三区视频在线| 久久青草福利网站| 久久亚洲一区二区三区四区五区高| 色爱精品视频一区| 日韩欧美国产一区二区| 久久这里有精品视频| 欧美精品成人91久久久久久久| 国产剧情日韩欧美| 国产精品av网站| 国内精品视频在线| 国产一区二区丝袜| 亚洲精品在线视频| 久久综合网hezyo| 久久久久久久久久久网站| 久久精品中文字幕一区| 亚洲欧美日韩网| 亚洲一区二区日本| 久久精品中文字幕免费mv| 亚洲视频自拍偷拍| 成人av番号网| 97精品一区二区视频在线观看| 日韩精品久久久久久福利| 成人精品视频在线| 亚洲精品99久久久久中文字幕| 992tv成人免费影院| 26uuu另类亚洲欧美日本一| 国产精品久久久久久久久久小说| 亚洲高清久久久久久| 久久6精品影院| 欧美电影免费观看电视剧大全| 日韩亚洲国产中文字幕| 欧美成人免费小视频| 久久综合亚洲社区| 亚洲欧美国产一本综合首页| 成人精品视频99在线观看免费| 中文字幕亚洲欧美日韩在线不卡| 久久九九精品99国产精品| 欧美日韩午夜激情| 欧美中文字幕在线观看| 国产精品视频地址| 欧美黄色www| 91经典在线视频| 日韩在线免费av|