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

来源:http://www.cnblogs.com/zkh101/archive/2017/12/22/8083368.html
-Advertisement-
Play Games

本篇文章基於"Java開發小技巧(二):自定義Maven依賴"中創建的父工程``project-monitor``實現,運用我們自定義的依賴包進行多工程依賴項目的開發。 ...


Maven多工程依賴項目開發流程

前言

本篇文章基於Java開發小技巧(二):自定義Maven依賴中創建的父工程project-monitor實現,運用我們自定義的依賴包進行多工程依賴項目的開發。

下麵以多可執行Jar包項目的開發為例,進行Maven多工程依賴項目開發的講解。

需求分析

首先來看一下封面圖,我們要實現的效果是:
1.多個項目共用一個項目的類和方法等通用內容
2.每個子項目單獨導入所需依賴,以及各自填充父項目配置文件中的占位符
3.子項目按指定目錄結構進行打包
4.所有子項目集成打包到一個統一的目錄,共用依賴包和配置文件等內容
5.打包後目錄結構:

  • bin:存放腳本文件,用來設置環境變數,執行相應的jar包
  • lib:依賴、項目jar包
  • etc:配置文件
  • ......

好啦,目標明確的,接下來要進行具體開發實現了

實現

打包配置

在上一篇文章中已經創建好了一個自定義的Maven依賴,相當於一個父項目,接下來我們新建一個子項目,命名為project-onepom.xml文件與父項目基本相同,所有依賴包都必須單獨引入,不同的是多了對父項目的依賴:

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

以及Maven插件maven-assembly-plugin的引入,用來實現依賴的打包以及打包後的目錄結構:

<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>

目錄結構配置位於項目根目錄下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>

以上就實現了項目打包的配置工作,實現流程圖中最後的項目結構,打包結果為zip文件

填充配置文件占位符

之前我們在父項目的spring上下文中定義了一個數據源bean,配置信息使用了占位符填充,所以如果我們想要使用這個bean,就需要替換其中的占位符信息,要怎麼做呢?
首先當然是創建配置文件了,在項目中創建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這個類來實現,在項目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

好了,接下來來測試項目的可行性,主要實現使用父項目定義的數據源來對MySql進行查詢。
先創建一個DemoService類,內容如下:

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配置文件,這裡就不貼出文件內容了。
OK,新建一個入口類來執行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();
    }
}

最終的項目結構如圖
項目結構

打包

一切準備就緒,輪到項目打包了,在項目根目錄執行以下Maven命令即可

mvn clean package

執行完成後你會發現target目錄的結構如圖所示
target目錄結構
project-one.zip就是我們要的打包結果,解壓後你會發現,依賴包和配置文件已經放在了各自的目錄下
zip包目錄結構

執行文件

項目開發完成,接下來就是執行程式了,以Windows平臺下為例,首先創建bin目錄,目錄中創建批處理文件setenv.batproject-one.bat
因為jar包與配置文件的分離,所以我們需要指定執行jar包時的classpath,批處理文件內容如下:

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文件的內容就不詳細解釋,有興趣可以百度瞭解一下,主要是為了拼接出完整的CLASSPATH,執行project-one-0.0.1.jar可執行jar包

運行

點擊project-one.bat運行程式
運行結果

結語

項目終於開發演示完畢,這裡只是創建一個打造可執行jar包的子項目作為例子,你還可以創建多個子項目,最後打包的時候合併相同的依賴和配置文件,然後在bin中創建相應項目的執行文件即可,各個子項目之間也可進行相互依賴。
以上開發技巧不僅適用於可執行jar包的開發,同樣適用於WEB項目的開發,具體還是由項目需求決定。

文章項目源碼已發佈到Github:https://github.com/ZKHDEV/MultDependPjo

本文為作者kMacro原創,轉載請註明來源:http://www.jianshu.com/p/3fa98dd52520


您的分享是我們最大的動力!

-Advertisement-
Play Games
更多相關文章
  • 解決方法: 在控制台輸入openVendor() ,清除裡面的wcsc wcsc.exe 然後重啟工具 ...
  • 一、環境說明: 1.一臺虛擬機,該系統已經裝好了docker; ip 192.168.10.224 虛擬網卡,與主機互通 操作系統rhel6 內核 2.6.32 64位 docker版本 1.7.1 2.一臺主機 ip 192.168.10.103 操作系統windows server 2008R ...
  • 轉自:http://www.cnblogs.com/V1haoge/p/6513651.html 觀察者介面:Observer 定義三個觀察者:Bianyi1、Bianyi2、Bianyi3 目標介面:Target 定義兩個嫌疑犯:XianFan1、XianFan2 測試類:Clienter ...
  • 什麼是SSO? SSO英文全稱Single Sign On,單點登錄。SSO是在多個應用系統中,用戶只需要登錄一次就可以訪問所有相互信任的應用系統。https://baike.baidu.com/item/SSO/3451380 本篇文章也主要是為了探討如何設計一個SSO系統 以下為需要實現的核心... ...
  • Nginx 反向代理 負載均衡 虛擬主機配置 通過本章你將學會利用Nginx配置多台虛擬主機,清楚代理伺服器的作用,區分正向代理和反向代理的區別,搭建使用Nginx反向搭理和負載均衡,瞭解Nginx常用配置的說明。即學即用,你還在等什麼?一睹為快先瞭解Nginx的三大功能 Nginx 可以作為一臺h ...
  • 用類來實現時間輸入輸出 實參聲明 標準類的方法 ...
  • Collection [I] Collection 層次結構 中的根介面。Collection 表示一組對象,這些對象也稱為 collection 的元素。一些 collection 允許有重覆的元素,而另一些則不允許。一些 collection 是有序的,而另一些則是無序的。JDK 不提供此介面的 ...
  • 在異常界面點SpringObjectFactory.java查看源碼,在 上設置斷電,進行Debug,發現appContext的值為null。這是因為,我們在Spring中配置了Struts2,在項目啟動後Struts自動去Spring容器中拿對象,而此時Spring並沒有啟動,所以要讓Spring ...
一周排行
    -Advertisement-
    Play Games
  • 移動開發(一):使用.NET MAUI開發第一個安卓APP 對於工作多年的C#程式員來說,近來想嘗試開發一款安卓APP,考慮了很久最終選擇使用.NET MAUI這個微軟官方的框架來嘗試體驗開發安卓APP,畢竟是使用Visual Studio開發工具,使用起來也比較的順手,結合微軟官方的教程進行了安卓 ...
  • 前言 QuestPDF 是一個開源 .NET 庫,用於生成 PDF 文檔。使用了C# Fluent API方式可簡化開發、減少錯誤並提高工作效率。利用它可以輕鬆生成 PDF 報告、發票、導出文件等。 項目介紹 QuestPDF 是一個革命性的開源 .NET 庫,它徹底改變了我們生成 PDF 文檔的方 ...
  • 項目地址 項目後端地址: https://github.com/ZyPLJ/ZYTteeHole 項目前端頁面地址: ZyPLJ/TreeHoleVue (github.com) https://github.com/ZyPLJ/TreeHoleVue 目前項目測試訪問地址: http://tree ...
  • 話不多說,直接開乾 一.下載 1.官方鏈接下載: https://www.microsoft.com/zh-cn/sql-server/sql-server-downloads 2.在下載目錄中找到下麵這個小的安裝包 SQL2022-SSEI-Dev.exe,運行開始下載SQL server; 二. ...
  • 前言 隨著物聯網(IoT)技術的迅猛發展,MQTT(消息隊列遙測傳輸)協議憑藉其輕量級和高效性,已成為眾多物聯網應用的首選通信標準。 MQTTnet 作為一個高性能的 .NET 開源庫,為 .NET 平臺上的 MQTT 客戶端與伺服器開發提供了強大的支持。 本文將全面介紹 MQTTnet 的核心功能 ...
  • Serilog支持多種接收器用於日誌存儲,增強器用於添加屬性,LogContext管理動態屬性,支持多種輸出格式包括純文本、JSON及ExpressionTemplate。還提供了自定義格式化選項,適用於不同需求。 ...
  • 目錄簡介獲取 HTML 文檔解析 HTML 文檔測試參考文章 簡介 動態內容網站使用 JavaScript 腳本動態檢索和渲染數據,爬取信息時需要模擬瀏覽器行為,否則獲取到的源碼基本是空的。 本文使用的爬取步驟如下: 使用 Selenium 獲取渲染後的 HTML 文檔 使用 HtmlAgility ...
  • 1.前言 什麼是熱更新 游戲或者軟體更新時,無需重新下載客戶端進行安裝,而是在應用程式啟動的情況下,在內部進行資源或者代碼更新 Unity目前常用熱更新解決方案 HybridCLR,Xlua,ILRuntime等 Unity目前常用資源管理解決方案 AssetBundles,Addressable, ...
  • 本文章主要是在C# ASP.NET Core Web API框架實現向手機發送驗證碼簡訊功能。這裡我選擇是一個互億無線簡訊驗證碼平臺,其實像阿裡雲,騰訊雲上面也可以。 首先我們先去 互億無線 https://www.ihuyi.com/api/sms.html 去註冊一個賬號 註冊完成賬號後,它會送 ...
  • 通過以下方式可以高效,並保證數據同步的可靠性 1.API設計 使用RESTful設計,確保API端點明確,並使用適當的HTTP方法(如POST用於創建,PUT用於更新)。 設計清晰的請求和響應模型,以確保客戶端能夠理解預期格式。 2.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...