Java開發(fā)小技巧(三):Maven多工程依賴項目

Maven多工程依賴項目開發(fā)流程

前言

本篇文章基于Java開發(fā)小技巧(二):自定義Maven依賴中創(chuàng)建的父工程project-monitor實現(xiàn)拙友,運(yùn)用我們自定義的依賴包進(jìn)行多工程依賴項目的開發(fā)。

下面以多可執(zhí)行Jar包項目的開發(fā)為例,進(jìn)行Maven多工程依賴項目開發(fā)的講解裙盾。

需求分析

首先來看一下封面圖欣孤,我們要實現(xiàn)的效果是:
1.多個項目共享一個項目的類和方法等通用內(nèi)容
2.每個子項目單獨導(dǎo)入所需依賴,以及各自填充父項目配置文件中的占位符
3.子項目按指定目錄結(jié)構(gòu)進(jìn)行打包
4.所有子項目集成打包到一個統(tǒng)一的目錄辟犀,共享依賴包和配置文件等內(nèi)容
5.打包后目錄結(jié)構(gòu):

  • bin:存放腳本文件,用來設(shè)置環(huán)境變量绸硕,執(zhí)行相應(yīng)的jar包
  • lib:依賴堂竟、項目jar包
  • etc:配置文件
  • ......

好啦,目標(biāo)明確的玻佩,接下來要進(jìn)行具體開發(fā)實現(xiàn)了

實現(xiàn)

打包配置

在上一篇文章中已經(jīng)創(chuàng)建好了一個自定義的Maven依賴出嘹,相當(dāng)于一個父項目,接下來我們新建一個子項目咬崔,命名為project-one税稼,pom.xml文件與父項目基本相同烦秩,所有依賴包都必須單獨引入,不同的是多了對父項目的依賴:

<dependency>
    <groupId>com.demo</groupId>
    <artifactId>project-monitor</artifactId>
    <version>0.0.1</version>
</dependency>

以及Maven插件maven-assembly-plugin的引入郎仆,用來實現(xiàn)依賴的打包以及打包后的目錄結(jié)構(gòu):

<plugin>
    <artifactId>maven-assembly-plugin</artifactId>
    <configuration>
        <appendAssemblyId>false</appendAssemblyId>
        <descriptors>
            <descriptor>package.xml</descriptor>
        </descriptors>
    </configuration>
    <executions>
        <execution>
            <id>make-assembly</id>
            <phase>package</phase>
            <goals>
                <goal>single</goal>
            </goals>
        </execution>
    </executions>
</plugin>

目錄結(jié)構(gòu)配置位于項目根目錄下package.xml配置文件中:

<assembly 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.0http://maven.apache.org/xsd/assembly-1.0.0.xsd">
    <id>package</id>
    <formats>
        <format>zip</format>
    </formats>
    <includeBaseDirectory>true</includeBaseDirectory>

    <fileSets>
        <fileSet>
            <directory>src/main/resources</directory>
            <includes>
                <include>*.properties</include>
                <include>*.xml</include>
            </includes>
            <outputDirectory>etc</outputDirectory>
        </fileSet>
    </fileSets>
    <dependencySets>
        <dependencySet>
            <outputDirectory>lib</outputDirectory>
            <scope>runtime</scope>
        </dependencySet>
    </dependencySets>
</assembly>

以上就實現(xiàn)了項目打包的配置工作只祠,實現(xiàn)流程圖中最后的項目結(jié)構(gòu),打包結(jié)果為zip文件

填充配置文件占位符

之前我們在父項目的spring上下文中定義了一個數(shù)據(jù)源bean扰肌,配置信息使用了占位符填充抛寝,所以如果我們想要使用這個bean,就需要替換其中的占位符信息曙旭,要怎么做呢盗舰?
首先當(dāng)然是創(chuàng)建配置文件了,在項目中創(chuàng)建jdbc.propertiesJDBC配置文件桂躏,如:

jdbc.driverClassName=com.mysql.jdbc.Driver
jdbc.url=jdbc:mysql://localdb:3306/test?characterEncoding=utf8&useSSL=true&serverTimezone=UTC
jdbc.username=root
jdbc.password=5EF28C5A9A0CE86C2D231A526ED5B388

然后我們需要借助PropertyPlaceholderConfigurer這個類來實現(xiàn)钻趋,在項目spring上下文中定義bean:

<bean class="org.springframework.beans.factory.config.PropertyPlaceholderConfigurer">
    <property name="locations">
        <value>classpath:jdbc.properties</value>
    </property>
    <property name="ignoreResourceNotFound" value="false"/>
</bean>

Bingo,占位符修改完畢沼头,別忘了引入父項目的上下文爷绘,畢竟我們要填充占位符的bean是在父項目中的:

<import resource="classpath*:project-monitor.xml"/>

測試Demo

好了,接下來來測試項目的可行性进倍,主要實現(xiàn)使用父項目定義的數(shù)據(jù)源來對MySql進(jìn)行查詢土至。
先創(chuàng)建一個DemoService類,內(nèi)容如下:

package com.demo.project.one.service;

import org.apache.log4j.Logger;

import javax.sql.DataSource;
import java.sql.Connection;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.sql.Statement;

public class DemoService {
    private static final Logger logger = Logger.getLogger(DemoService.class);
    private DataSource dataSource;

    public void queryDb(){
        Connection conn = null;
        Statement stmt = null;
        ResultSet rs = null;

        try {
            conn = dataSource.getConnection();
            stmt = conn.createStatement();
            rs = stmt.executeQuery("select * from movie limit 1");
            while(rs.next()){
                logger.info(String.format("Movie[Id=%d,Title=%s,Director=%s,Genre=%s,Language=%s]",
                        rs.getInt(1),
                        rs.getString(2),
                        rs.getString(3),
                        rs.getString(4),
                        rs.getString(5)
                        ));
            }
        } catch (SQLException e) {
            e.printStackTrace();
        } finally {
            try {
                if(rs != null){
                    rs.close();
                }
                if(stmt != null){
                    stmt.close();
                }
                if(conn != null){
                    conn.close();
                }
            } catch (SQLException e) {
                e.printStackTrace();
            }
        }
    }

    public void setDataSource(DataSource dataSource) {
        this.dataSource = dataSource;
    }
}

在上下文中為其注入dataSource定義:

<bean id="demoService" class="com.demo.project.one.service.DemoService">
    <property name="dataSource" ref="dataSource"/>
</bean>

別忘了添加log4j.properties配置文件猾昆,這里就不貼出文件內(nèi)容了陶因。
OK,新建一個入口類來執(zhí)行DemoService的測試吧:

package com.demo.project.one;

import com.demo.project.one.service.DemoService;
import org.springframework.context.ConfigurableApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext;

public class Application {
    public static void main(String[] args){
        ConfigurableApplicationContext context = new ClassPathXmlApplicationContext("/project-one.xml");
        DemoService demoService = (DemoService)context.getBean("demoService");
        demoService.queryDb();
    }
}

最終的項目結(jié)構(gòu)如圖


項目結(jié)構(gòu)

打包

一切準(zhǔn)備就緒垂蜗,輪到項目打包了楷扬,在項目根目錄執(zhí)行以下Maven命令即可

mvn clean package

執(zhí)行完成后你會發(fā)現(xiàn)target目錄的結(jié)構(gòu)如圖所示

target目錄結(jié)構(gòu)

project-one.zip就是我們要的打包結(jié)果,解壓后你會發(fā)現(xiàn)贴见,依賴包和配置文件已經(jīng)放在了各自的目錄下
zip包目錄結(jié)構(gòu)

執(zhí)行文件

項目開發(fā)完成烘苹,接下來就是執(zhí)行程序了,以Windows平臺下為例片部,首先創(chuàng)建bin目錄镣衡,目錄中創(chuàng)建批處理文件setenv.batproject-one.bat
因為jar包與配置文件的分離档悠,所以我們需要指定執(zhí)行jar包時的classpath廊鸥,批處理文件內(nèi)容如下:

setenv.bat

@echo off
set SRC_DIR=%cd%

cd %~dp0
cd ..
set MAIN_HOME=%cd%

cd %SRC_DIR%

set BIN_HOME=%MAIN_HOME%\bin
set ETC_HOME=%MAIN_HOME%\etc
set LIB_HOME=%MAIN_HOME%\lib
set CLASSPATH=%ETC_HOME%;%JAVA_HOME%\lib\tools.jar

for %%i in (%LIB_HOME%\*.jar) do set CLASSPATH=!CLASSPATH!;%%i

project-one.bat

@echo off
@setlocal enableextensions enabledelayedexpansion
call setenv.bat

chcp 65001
java -cp %CLASSPATH% com.demo.project.one.Application
pause

bat文件的內(nèi)容就不詳細(xì)解釋,有興趣可以百度了解一下辖所,主要是為了拼接出完整的CLASSPATH惰说,執(zhí)行project-one-0.0.1.jar可執(zhí)行jar包

運(yùn)行

點擊project-one.bat運(yùn)行程序

運(yùn)行結(jié)果

結(jié)語

項目終于開發(fā)演示完畢,這里只是創(chuàng)建一個打造可執(zhí)行jar包的子項目作為例子缘回,你還可以創(chuàng)建多個子項目吆视,最后打包的時候合并相同的依賴和配置文件典挑,然后在bin中創(chuàng)建相應(yīng)項目的執(zhí)行文件即可,各個子項目之間也可進(jìn)行相互依賴啦吧。
以上開發(fā)技巧不僅適用于可執(zhí)行jar包的開發(fā)搔弄,同樣適用于WEB項目的開發(fā),具體還是由項目需求決定丰滑。

文章項目源碼已發(fā)布到Github:https://github.com/ZKHDEV/MultDependPjo

本文為作者kMacro原創(chuàng),轉(zhuǎn)載請注明來源:http://www.reibang.com/p/3fa98dd52520倒庵。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末褒墨,一起剝皮案震驚了整個濱河市,隨后出現(xiàn)的幾起案子擎宝,更是在濱河造成了極大的恐慌郁妈,老刑警劉巖,帶你破解...
    沈念sama閱讀 218,858評論 6 508
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件绍申,死亡現(xiàn)場離奇詭異噩咪,居然都是意外死亡,警方通過查閱死者的電腦和手機(jī)极阅,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,372評論 3 395
  • 文/潘曉璐 我一進(jìn)店門胃碾,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人筋搏,你說我怎么就攤上這事仆百。” “怎么了奔脐?”我有些...
    開封第一講書人閱讀 165,282評論 0 356
  • 文/不壞的土叔 我叫張陵俄周,是天一觀的道長。 經(jīng)常有香客問我髓迎,道長峦朗,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 58,842評論 1 295
  • 正文 為了忘掉前任排龄,我火速辦了婚禮波势,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘涣雕。我一直安慰自己艰亮,他們只是感情好,可當(dāng)我...
    茶點故事閱讀 67,857評論 6 392
  • 文/花漫 我一把揭開白布挣郭。 她就那樣靜靜地躺著迄埃,像睡著了一般。 火紅的嫁衣襯著肌膚如雪兑障。 梳的紋絲不亂的頭發(fā)上侄非,一...
    開封第一講書人閱讀 51,679評論 1 305
  • 那天蕉汪,我揣著相機(jī)與錄音,去河邊找鬼逞怨。 笑死者疤,一個胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的叠赦。 我是一名探鬼主播驹马,決...
    沈念sama閱讀 40,406評論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼除秀!你這毒婦竟也來了糯累?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 39,311評論 0 276
  • 序言:老撾萬榮一對情侶失蹤册踩,失蹤者是張志新(化名)和其女友劉穎泳姐,沒想到半個月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體暂吉,經(jīng)...
    沈念sama閱讀 45,767評論 1 315
  • 正文 獨居荒郊野嶺守林人離奇死亡胖秒,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 37,945評論 3 336
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發(fā)現(xiàn)自己被綠了慕的。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片阎肝。...
    茶點故事閱讀 40,090評論 1 350
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖肮街,靈堂內(nèi)的尸體忽然破棺而出盗痒,到底是詐尸還是另有隱情,我是刑警寧澤低散,帶...
    沈念sama閱讀 35,785評論 5 346
  • 正文 年R本政府宣布俯邓,位于F島的核電站,受9級特大地震影響熔号,放射性物質(zhì)發(fā)生泄漏稽鞭。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點故事閱讀 41,420評論 3 331
  • 文/蒙蒙 一引镊、第九天 我趴在偏房一處隱蔽的房頂上張望朦蕴。 院中可真熱鬧,春花似錦弟头、人聲如沸吩抓。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,988評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽疹娶。三九已至,卻和暖如春伦连,著一層夾襖步出監(jiān)牢的瞬間雨饺,已是汗流浹背钳垮。 一陣腳步聲響...
    開封第一講書人閱讀 33,101評論 1 271
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機(jī)就差點兒被人妖公主榨干…… 1. 我叫王不留额港,地道東北人饺窿。 一個月前我還...
    沈念sama閱讀 48,298評論 3 372
  • 正文 我出身青樓,卻偏偏與公主長得像移斩,于是被迫代替她去往敵國和親肚医。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點故事閱讀 45,033評論 2 355

推薦閱讀更多精彩內(nèi)容

  • Spring Cloud為開發(fā)人員提供了快速構(gòu)建分布式系統(tǒng)中一些常見模式的工具(例如配置管理向瓷,服務(wù)發(fā)現(xiàn)忍宋,斷路器,智...
    卡卡羅2017閱讀 134,659評論 18 139
  • Spring Boot 參考指南 介紹 轉(zhuǎn)載自:https://www.gitbook.com/book/qbgb...
    毛宇鵬閱讀 46,822評論 6 342
  • Android 自定義View的各種姿勢1 Activity的顯示之ViewRootImpl詳解 Activity...
    passiontim閱讀 172,163評論 25 707
  • 塞翁失馬焉知非福风罩,我把他放在自己身上去想想——失馬時定是氣急敗壞,稽首跺腳舵稠。得福時又惺惺作態(tài)超升,感覺自己是天的孩子,...
    沒有蠟閱讀 327評論 0 1
  • 時間過得真快哺徊,一眨眼就到了中元節(jié)了室琢。 按我們寧化人的說法,中元節(jié)是鬼門大開的日子落追。所有過世的人到了中元節(jié)盈滴,都可以出...
    清風(fēng)朗月7204閱讀 599評論 0 0