SpringBank 开发日志 使用maven构建dubbo服务的可执行jar包
写这篇日志的时候,我已经完成了这个目标,并且中间经历了一次面试。现在回过头看,已经觉得印象不那么深刻了,果然还是一边思考,一边记录这样最好。但我还是严格要求自己,从新做了梳理,对相关配置进行了整理和说明,以下。
谁是启动类
既然是构建可执行的JAR包,首先要明确启动类是谁。一开始做的时候,我是使用的自己写的启动类
public static void main(String[] args) {
new ClassPathXmlApplicationContext("classpath:META-INF/spring/start-config.xml");
log.debug("IocMain 启动完成");
}
后来了解到,dubbo自带启动类,并且实现了优雅关机,所以无论是在eclipse中测试,还是打包指定启动类,都改为使用 dubbo自带的了。
包应该产生在哪个项目里
我一开始认为包应该产生在springbank-parent里,并且我做了一些尝试,实际上是行不通的,parent的packaging不能指定为jar或者war而只能是pom。在这个过程中我也意识到自己对maven打包的理解是错误的。任何一个项目,只要packaging配置为jar(jar为默认配置),则该项目打包后会形成jar包.
具体配置
当时折腾了许久,主要是要配合dubbo启动类的特点,做一些特别的配置。下面是配置文件,刚刚我特意又增加了许多注释,这样以后就能看的明白了
<build>
<!-- resources是一个资源元素列表,每个资源元素都描述了与这个项目相关的文件和包含文件的位置 -->
<resources>
<!-- 目的:将spring相关文件打包后放到jar包根目录下 -->
<!-- 理解:如果没有这个配置,将会导致springbank-portal等项目打完包之后没有任何spring配置文件。所以我对resource标签的理解就是,它是一个资源配置
例如下面这个这个配置,其中directory就是资源在源码项目所在的位置,targetPath的意思就是打包之后要放在哪里,所谓放置在${project.build.directory}/classes,实际上就是放在jar包的根目录 -->
<resource>
<targetPath>${project.build.directory}/classes</targetPath>
<directory>src/main/resources</directory>
<filtering>false</filtering>
</resource> <!-- 目的:结合com.alibaba.dubbo.container.Main需要做的配置 -->
<!-- 理解:结合上一个resource的描述,可以看出,这里是将start-config.xml文件放到了jar包里的META-INF/spring目录下
之所以要这样放,是因为dubbo默认的启动类,是从META-INF/spring目录下加载spring文件。其实这里的配置是一个难点,因为既要考虑到能让dubbo加载到start-config.xml
也要考虑到能让start-config.xml里面的import能够找到相关的资源文件。我反复尝试了很多很多次,结合上面的resource配置,即将spring文件直接打包时放在classpath,最终在start-config.xml才能通过类似classpath:infrastructure.xml方式引用到相关文件-->
<resource>
<!-- targetPath 指定放置构建资源集的目录结构.目标路径默认为基础目录.在JAR中打包的资源通常指定的目标路径是META-INF,project.build.directory缺省为target -->
<targetPath>${project.build.directory}/classes/META-INF/spring</targetPath>
<!-- 这个元素的值定义了资源被找到的地方.构建的默认目录是$ {basedir} / src / main / resources -->
<directory>src/main/resources</directory>
<filtering>true</filtering>
<!-- 一组文件模式,使用*作为通配符,指定要作为资源包含在指定目录下的文件 -->
<includes>
<include>start-config.xml</include>
</includes>
</resource>
</resources> <!-- pluginManagement之于plugins 如同 dependencyManagement之于dependencies 。是一样的,所以我认为这里做这样一个配置,对我的目的并没有用,而且我确实也不理解这个配置的涵义,先放在这里,后面来研究 -->
<pluginManagement>
<plugins>
<!--This plugin's configuration is used to store Eclipse m2e settings
only. It has no influence on the Maven build itself. -->
<plugin>
<groupId>org.eclipse.m2e</groupId>
<artifactId>lifecycle-mapping</artifactId>
<version>1.0.0</version>
<configuration>
<lifecycleMappingMetadata>
<pluginExecutions>
<pluginExecution>
<pluginExecutionFilter>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-dependency-plugin</artifactId>
<versionRange>[1.0,)</versionRange>
<goals>
<goal>copy-dependencies</goal>
</goals>
</pluginExecutionFilter>
<action>
<ignore />
</action>
</pluginExecution>
</pluginExecutions>
</lifecycleMappingMetadata>
</configuration>
</plugin>
</plugins>
</pluginManagement> <plugins>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-compiler-plugin</artifactId>
<version>3.5</version>
<configuration>
<!-- 指定source和target的版本 -->
<source>1.8</source>
<target>1.8</target>
</configuration>
</plugin> <!-- 打包配置,配置了哪些内容需要打包到jar里,配置了manifest文件的内容 -->
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-jar-plugin</artifactId>
<configuration>
<!-- 将target/classes下所有内容放到jar里 -->
<classesDirectory>target/classes</classesDirectory>
<archive>
<manifest>
<!-- 是否创建一个Class-Path清单条目,默认值是false, 改为true,因为我们确实需要这样一个文件,它会告诉虚拟机启动类是谁,哪些东东要加入classpath-->
<addClasspath>true</addClasspath>
<mainClass>com.alibaba.dubbo.container.Main</mainClass>
<!-- 是否使用唯一的时间戳快照版本而不是-SNAPSHOT版本.默认值是true -->
<useUniqueVersions>false</useUniqueVersions>
<!-- 将作为所有Class-Path条目前缀的文本,默认值是"" -->
<classpathPrefix>lib/</classpathPrefix>
</manifest>
<!-- A list of key/value pairs to add to the manifest. -->
<manifestEntries>
<Class-Path>.</Class-Path>
</manifestEntries>
</archive>
<outputDirectory>${standalone.output.dir}</outputDirectory>
</configuration>
<executions>
<execution>
<id>jar</id>
<phase>package</phase>
<goals>
<goal>jar</goal>
</goals>
</execution>
</executions>
</plugin> <!-- 依赖打包配置,目的是将自己的依赖也打包,然后放到指定的目录下 -->
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-dependency-plugin</artifactId>
<executions>
<execution>
<id>copy-dependencies</id>
<phase>package</phase>
<goals>
<goal>copy-dependencies</goal>
</goals>
<configuration>
<type>jar</type>
<includeTypes>jar</includeTypes>
<useUniqueVersions>fasle</useUniqueVersions>
<outputDirectory>${standalone.output.dir}/lib</outputDirectory>
</configuration>
</execution>
</executions>
</plugin>
</plugins>
</build>
SpringBank 开发日志 使用maven构建dubbo服务的可执行jar包的更多相关文章
- Dubbo-使用Maven构建Dubbo服务的可执行jar包
一.为什么要构建Dubbo服务的可执行jar包? 1.1 Dubbo服务运行方式比较 ✎使用Servlet容器运行(Tomcat.Jetty等) ---不可取 --缺点:增加复杂性(多了容器的端口) ...
- 跟我学习dubbo-使用Maven构建Dubbo服务的可执行jar包(4)
Dubbo服务的运行方式: 1.使用Servlet容器运行(Tomcat.Jetty等)----不可取 缺点:增加复杂性(端口.管理) 浪费资源(内存) 官方:服务容器是一个standalone的启动 ...
- 使用maven构建dubbo服务的可执行jar包+Dubbo 程序实例
https://blog.csdn.net/zsg88/article/details/76100482 https://blog.csdn.net/zsg88/article/details/762 ...
- maven项目用assembly打包可执行jar包
该方法只可打包非spring项目的可执行jar包,spring项目可参考:http://www.cnblogs.com/guazi/p/6789679.html 1.添加maven插件: <!- ...
- Dubbo入门到精通学习笔记(二):Dubbo管理控制台、使用Maven构建Dubbo的jar包、在Linux上部署Dubbo privider服务(shell脚本)、部署consumer服务
文章目录 Dubbo管理控制台 1.Dubbo管理控制台的主要作用: 2.管理控制台主要包含: 3.管理控制台版本: 安装 Dubbo 管理控制台 使用Maven构建Dubbo服务的可执行jar包 D ...
- Tomcat 中部署 web 应用 ---- Dubbo 服务消费者 Web 应用 war 包的部署
使用Maven构建Dubbo服务的可执行jar包 Dubbo服务的运行方式: 1.使用Servlet容器运行(Tomcat.Jetty等)----不可取 缺点:增加复杂性(端口.管理) 浪费资源(内存 ...
- 用Maven快速生成带有依赖的可执行jar包
一.背景 最近项目在做微服务的拆分,那么我们想让我们的容器启动更加的轻量级,所以我们选择放弃tomcat等容器,而是通过maven生成带有指定依赖的可执行jar包的方式进行处理,本文我将分享如何通过m ...
- Maven将代码及依赖打成一个Jar包的方式
Maven可以使用mvn package指令对项目进行打包,如果使用java -jar xxx.jar执行运行jar文件,会出现"no main manifest attribute, in ...
- 基于dubbo源码包通过Maven构建dubbo的详细步骤
通过Maven构建dubbo 既然可以下载得到源码以及发布包,那么为什么要去构建dubbo呢?,我们先来看下dubbo的主要模块: 我们不仅要使用dubbo的核心框架,还要使用它的一些服务,比如管理控 ...
随机推荐
- whistle工具全程入门
接触过前后端开发的同学应该都了解网络请求代理工具fiddler(mac下面常用的是Charles),可以用来拦截分析请求.包装请求.本地调试和移动端代理开发调试等.多多少少,fiddler和Charl ...
- Win2008R2配置WebDeploy发布网站
一.配置服务器 1.安装管理服务 2.点击管理服务进行配置 二.安装WebDeploy 2.1通过离线安装包方式安装: https://www.iis.net/downloads/microsoft/ ...
- HDU - 1160 FatMouse's Speed 动态规划LIS,路径还原与nlogn优化
HDU - 1160 给一些老鼠的体重和速度 要求对老鼠进行重排列,并找出一个最长的子序列,体重严格递增,速度严格递减 并输出一种方案 原题等于定义一个偏序关系 $(a,b)<(c.d)$ 当且 ...
- 转-JavaWeb三大组件之Listener监听器
JavaWeb三大组件之Listener监听器一.概述1,它是一个接口,内容由我们来实现 2,它需要注册,例如注册在按钮上 3,监听器中的方法,会在特殊事件发生时被调用 二.JavaWeb中的监听器1 ...
- jquery日常使用总结
1.如何跳出each循环 用 return false, 不是 break. $.each(resArray, function(j, n) { if (1 == n) { return false; ...
- 加载UI工程的csb,以及纹理缓存情况
以plist+PNG模式加载csb,并播放UI工程做的动画,用法如下 local Layer = cc.CSLoader:createNode("res/yk/interface/loadi ...
- 如何将代码通过vs2017加载到GitHub
(1)登陆GitHub并注册账户,在用户中新建repository (2)建立后,会给出新建repository地址,将其复制 (3)用VS新建一个项目,勾选“新建Git存储库”或者打开一个已经创 ...
- hive学习04-员工部门表综合案例
知识点: 格式转换:cast(xxx as int) 按某列分桶某列排序,排序后打标机:例如:求每个地区工资最高的那个人的信息: ROW_NUMBER() OVER(PARTITION BY COLU ...
- Mac配置Jdk 安装及系统环境配置
注:本文来于< Mac配置Java开发环境 > 1. 下载JDK 从下面链接选择合适版本的安装包进行下载...笔者下载的是jdk-9.0.1 链接:http://www.oracl ...
- Oracle Ora 错误解决方案合集
注:本文来源于 < Oracle学习笔记 --- Oracle ORA错误解决方案 > ORA-00001: 违反唯一约束条件 (.)错误说明:当在唯一索引所对应的列上键入重复值时,会触发 ...