前言

本篇文章基于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目录的结构如图所示

project-one.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.batchcp 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。

转载于:https://www.cnblogs.com/Stir-friedEggplant/p/8086569.html

Mavean多工程依赖项目相关推荐

  1. java 多项目_Java开发小技巧(三):Maven多工程依赖项目

    Maven多工程依赖项目开发流程 前言 本篇文章基于Java开发小技巧(二):自定义Maven依赖中创建的父工程project-monitor实现,运用我们自定义的依赖包进行多工程依赖项目的开发. 下 ...

  2. vs 外部依赖项、附加依赖项以及如何添加依赖项目

    我们在 VS 中创建 Win32 控制台应用程序,vs 会为解决方案创建默认地创建 4 个 filters(资源管理器中没有对应的目录和文件夹): 头文件:一般为 .h 文件 外部依赖项 源文件:一般 ...

  3. eclipse中用maven多模块管理,然后主项目无法调用其他被依赖项目里的方法,解决办法

    eclipse中用maven多模块管理,然后主项目无法调用其他被依赖项目里的方法,解决办法 参考文章: (1)eclipse中用maven多模块管理,然后主项目无法调用其他被依赖项目里的方法,解决办法 ...

  4. 解决:single failed: For artifact {null:null:null:jar}: The groupId cannot be empty. 把工程依赖的jar包打到入jar中

    前些天发现了一个巨牛的人工智能学习网站,通俗易懂,风趣幽默,忍不住分享一下给大家.点击跳转到教程. 1. 执行 mvn clean install 报错: Execution make-assembl ...

  5. maven创建父子依赖项目—pom

    maven创建父子依赖项目 maven创建父子依赖项目: 参考思路: 思维图: 三种项目示例: jar:控制台项目: war:web项目: war:web项目:(待写) 案例:横向拆分(按照项目结构进 ...

  6. 中国民贸会南粤分会关爱未来人口发展工程公益项目在韶关启动

    为贯彻落实国务院发布的<健康中国行动(2019-2030)>,进一步推动健康中国战略目标的实现,经过前期的调研.考察申请等工作.于2021年3月30日在韶关市举行了"关爱未来·人 ...

  7. Gradle如何排除依赖项目的某些包

    Gradle如何排除依赖项目的某些包 在开发一个Gradle相关项目时,遇到了Gradle如何排除依赖项目的某些包这个问题,网上也并不能找到相关问题的解决方案,这就让我需要我仔细阅读官方文档相关部分了 ...

  8. 计算机科学博士上海纽约大学,聚焦 | 上海纽约大学推出全新交通运输规划与工程博士项目...

    上海纽约大学与纽约大学坦登工程学院以及纽约大学土木与城市工程系合作,推出一项新的联合博士项目--交通运输规划与工程博士项目.这也是上海纽约大学与纽约大学合作开设的第七个博士项目. "上海一直 ...

  9. 合肥市2023年度高校毕业生“双千培养工程”培训项目学员招募公告

    为贯彻落实人社部实施促进高校毕业生等青年就业创业推进计划要求,提升高校毕业生就业技能,拟开展高校毕业生"双千培养工程"培训项目.根据工作计划安排,现面向高校和社会招募学员参加培训, ...

最新文章

  1. SAP MM 对于MRKO事务代码的几点优化建议
  2. php-dev离线安装,局域网 pm2 离线安装
  3. 16进制颜色透明_PPT | 如何快速提取图片颜色之人生太卷
  4. 如何制作Vuejs组件,并且在项目中使用
  5. ObjectStreamClass:监视Java对象的序列化
  6. android点击下拉历史记录,uni-app,社交应用中,聊天页面下拉onPullDownRefresh获取历史消息,数据合并之后,滚动到下拉之前的位置,页面看不见闪动,完美解决...
  7. (二十)python 3 匿名函数
  8. linux初始:命令行解释器(shell)、权限
  9. ORACLE集群日志收集,【RAC】Oracle RAC集群环境下日志文件结构
  10. Masonry 控件详解
  11. 图解FCKeditor在asp.net环境的安装(上)
  12. 数字逻辑educoder实训项目 logisim实现 交通灯系统设计超详细实验步骤,绝对完整
  13. 色彩设计的原理txt_设计原理:颜色
  14. 硬件实现声音信号压缩
  15. k8s常见故障排查一点通
  16. Rust Async: smol源码分析-Executor篇
  17. 装机部落GhostXP_SP3国庆装机版2013
  18. index.php 被替换,中间人恶搞替换图片
  19. 2022年11月PMP考试时间出炉!考生须知
  20. C++中的平方、开方、绝对值

热门文章

  1. css3盒子模型微课_CSS3 盒子模型
  2. android减少动态效果,【技巧】手机运行变慢?试试这些办法!
  3. php上传虚假图片,解决PHP上传多个图片并校验的代码问题
  4. 使用QEMU实现vexpress-ca9板卡的linux启动
  5. html中抓取span中的值,JavaScript如何获取span元素的文本?
  6. 主题模型︱几款新主题模型——SentenceLDA、CopulaLDA、TWE简析与实现
  7. [spring]用IEDA创建spring boot项目
  8. qt设置窗口不在任务栏上显示
  9. SPOJ 104 Highways(最小生成树计数)
  10. 岭回归Lasso回归