dubbo-容器(可执行性jar启动项目)

1 引言

众所周知,不管是dubbo服务的提供方还是服务的消费方,我们都可以把工程打包成war包放到web容器(servlet容器)中启动,但这种方式是否合理呢?在dubbo的 官方文档 中,介绍了dubbo的服务提供方其实是不需要web容器单独运行的,也就是本文将要介绍的通过java命令 java -jar dubbo服务.jar 这个命令运行服务,为了运行这个jar包,我们必须把服务打包成可运行jar包,并把所依赖的jar放在约定的目录下。

如果不了解可执行jar的打包方法,请参考文章:https://my.oschina.net/thinwonton/blog/877493

为什么对于服务提供方的工程,dubbo官方推荐使用可执行jar的方式运行呢,下面对三种启动方式进行比较:

  1. 使用web容器(Tomcat、Jetty等)启动dubbo服务 : 增加端口管理复杂性, tomcat/jetty等都需要占用端口,dubbo服务也需要端口;浪费资源(内存),单独启动 tomcat,jetty占用内存大
  2. 使用自建Main方法类运行spring容器启动dubbo服务:Dobbo提供的优雅停机高级特性没用上,并且自已编写启动类可能会有缺陷
  3. 使用Dubbo框架提供的Main方法类运行Spring容器启动服务:官方建议使用,dubbo框架本身提供启动类(com.alibaba.dubbo.container.Main),可实现优雅关机

对于优雅停机的概念和原理,请参考文档: http://dubbo.io/User+Guide-zh.htm#UserGuide-zh-%E4%BC%98%E9%9B%85%E5%81%9C%E6%9C%BA

那么,下面我们来研究怎么使用java命令启动dubbo服务吧。

2 命令行运行dubbo服务

相对于使用web容器启动的方式,该方式除了需要修改maven配置外,不需要修改原有的配置。

2.1 打包可运行jar的maven配置

主要利用maven的maven-jar-plugin和maven-dependency-plugin插件,前一个插件是配置可运行jar的manifest清单文件,该清单文件主要配置主程序main所在的位置还有依赖的jar包的位置。由于dubbo启动类 com.alibaba.dubbo.container.Main 默认自动加载META-INF/spring目录下的所有Spring配置,所以我们还需要把spring的配置文件通过maven拷贝到指定目录。除此之外,packaging的构建包类型修改为jar。完整的pom文件如下:

<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>
    <parent>
        <groupId>com.github.thinwonton.dubbo.sample</groupId>
        <artifactId>dubbo-parent</artifactId>
        <version>0.0.1-SNAPSHOT</version>
        <relativePath>../dubbo-parent</relativePath>
    </parent>
    <groupId>com.github.thinwonton.dubbo.sample</groupId>
    <artifactId>container-provider</artifactId>
    <version>0.0.1-SNAPSHOT</version>
    <packaging>jar</packaging>
    <name>dubbo-container-提供者</name>

    <build>
        <!-- 输出文件名 -->
        <finalName>dubbo-container-provider</finalName>

        <resources>
            <resource>
                <targetPath>${project.build.directory}/classes</targetPath>
                <directory>src/main/resources</directory>
                <filtering>true</filtering>
                <includes>
                    <include>*/.xml</include>
                    <include>*/.properties</include>
                </includes>
                <excludes>
                    <!-- spring配置文件由下面的配置:拷贝到META-INF/spring中 -->
                    <exclude>spring/*.xml</exclude>
                </excludes>
            </resource>
            <!-- com.alibaba.dubbo.container.Main加载spring配置文件的路径 META-INF/spring -->
            <resource>
                <targetPath>${project.build.directory}/classes/META-INF/spring</targetPath>
                <directory>src/main/resources/spring</directory>
                <filtering>true</filtering>
                <includes>
                    <include>*.xml</include>
                </includes>
            </resource>
        </resources>

        <plugins>
            <!-- 资源文件拷贝插件 -->
            <plugin>
                <groupId>org.apache.maven.plugins</groupId>
                <artifactId>maven-resources-plugin</artifactId>
                <version>2.7</version>
                <configuration>
                    <encoding>UTF-8</encoding>
                </configuration>
            </plugin>

            <!-- java编译插件 -->
            <plugin>
                <groupId>org.apache.maven.plugins</groupId>
                <artifactId>maven-compiler-plugin</artifactId>
                <version>3.2</version>
                <configuration>
                    <source>1.7</source>
                    <target>1.7</target>
                    <encoding>UTF-8</encoding>
                </configuration>
            </plugin>

            <!-- 打包jar文件时,配置manifest文件,加入lib包的jar依赖 -->
            <plugin>
                <groupId>org.apache.maven.plugins</groupId>
                <artifactId>maven-jar-plugin</artifactId>
                <version>2.6</version>
                <configuration>
                    <classesDirectory>target/classes/</classesDirectory>
                    <archive>
                        <manifest>
                            <!-- 打包时 MANIFEST.MF文件不记录的时间戳版本 -->
                            <useUniqueVersions>false</useUniqueVersions>
                            <!-- 添加Class-Path -->
                            <addClasspath>true</addClasspath>
                            <!-- Class-Path添加前缀 -->
                            <classpathPrefix>lib/</classpathPrefix>
                            <!-- 指定Main-Class -->
                            <mainClass>com.alibaba.dubbo.container.Main</mainClass>
                        </manifest>
                    </archive>
                </configuration>
            </plugin>

            <!-- 拷贝依赖的jar包到lib目录 -->
            <plugin>
                <groupId>org.apache.maven.plugins</groupId>
                <artifactId>maven-dependency-plugin</artifactId>
                <version>2.10</version>
                <executions>
                    <execution>
                        <id>copy</id>
                        <phase>package</phase>
                        <goals>
                            <goal>copy-dependencies</goal>
                        </goals>
                        <configuration>
                            <outputDirectory>
                                <!-- 拷贝依赖到lib文件夹 -->
                                ${project.build.directory}/lib
                            </outputDirectory>
                        </configuration>
                    </execution>
                </executions>
            </plugin>
        </plugins>
    </build>
</project>

2.2 运行

(1)到工程目录的根目录,运行 mvn clean package ,由maven在target目录构建jar包和拷贝依赖包到target/lib目录

(2)自建一个文件夹,把构建出来的jar和lib目录拷贝到新建文件夹中,然后使用java -jar命令运行服务

java -jar dubbo-container-provider.jar

文章转载自 开源中国社区 [http://www.oschina.net]

时间: 2024-09-22 07:45:11

dubbo-容器(可执行性jar启动项目)的相关文章

spring 和hibernate项目制作可执行的jar包

spring 和hibernate项目制作可执行的jar包 如何把spring和hibernate项目制作可运行的jar包呢? 就是在命令行中运行 Java -jar  xxx.jar 就可以运行java程序.例如  我的这个项目使用了hibernate和spring,不是web项目. 构建工具:maven IDE:eclipse 目录结构如下:     上图中beans.xml是spring的配置文件,内容如下:   Xml代码   <?xml version="1.0" en

java-spring 注入 启动项目之后报的错

问题描述 spring 注入 启动项目之后报的错 ![ 解决方案 web项目启动Spring容器 解决方案二: 错误没截取完整,但是从片段来看,应该是你的有个类名字写错了,或者不存在. 还有一种情况就是jar没引入完全.你可以自己再找找 解决方案三: 这是找不到类啊!是不是哪个包没有导进去?

eclipse启动项目时遇到问题,报错!

问题描述 eclipse启动项目时遇到问题,报错! FATAL ERROR in native method: JDWP No transports initialized, jvmtiError=AGENT_ERROR_TRANSPORT_INIT(197) ERROR: transport error 202: connect failed: Connection timed out ERROR: JDWP Transport dt_socket failed to initialize,

c-可执行命令(.bat)启动一个端口,关闭窗口后,如何保证端口不关闭

问题描述 可执行命令(.bat)启动一个端口,关闭窗口后,如何保证端口不关闭 用一个可执行命令文件执行一个命令(java -cp ECDataCenter.jar amsserver.PusherServer 5000)后会在电脑上启动一个端口5000,但是关掉黑窗口后,端口就停了,我在命令行的最后加了个&(变为java -cp ECDataCenter.jar amsserver.PusherServer 5000),关掉黑窗口后,端口也会停,大侠们有没有处理过此问题的?

Hibernate3连接oracle11g在启动项目时总是抛出如下异常

问题描述 我的hibernate.cfg.xml的配置文件如下:<?xml version="1.0" encoding="UTF-8"?><!DOCTYPE hibernate-configuration PUBLIC "-//Hibernate/Hibernate Configuration DTD 3.0//EN" "http://hibernate.sourceforge.net/hibernate-confi

Win7开机要检查启动项目

Windows中有自带的启动文件夹,它是最常见的启动项目,这里要注意Win7开机要检查启动项目.如果把程序装入到这个文件夹中,系统启动就会自动地加载相应程序,如果被更改,很危险. 所以检查启动项目是很有必要的. Wininit.ini 我们知道,Windows的安装程序常常调用这个程序来实现安装程序后的删除工作,所以不要小看它,如果在它上面做手脚的话,可以说是非常隐蔽.非常完美的! 它在系统盘的Windows目录下,用记事本打开它(有时候是wininit.hak文件)可以看到相应的内容.很明显,

彻底优化计算机开机时启动项目

  首先检查开始菜单中启动项目中是否有相关开机启动的软件设置,如有则安需要进行删除. 计算机开机时启动项目-优化开机启动项"> 利用系统配置功能实现开始运行 msconfig 回车. 进行系统配置对话框,选择启动选项卡. 把不需要开机启动的项目前选项对勾去掉即可.利用注册表功能实现开始运行 regedit 回车 打开注册表编辑器窗口. 选择进入到目录 HKEY_LOCAL_MACHINESOFTWAREMicrosoftWindowsCurrentVersionRun HKEY_LOCAL

怎样优化计算机开机时启动项目

  看到题目可能有人会问:开机启动项不是开始菜单中启动项目中的文件么?或者更深一步讲是注册表或是服务计划中的启动项目. 是的,这的确是开机启动项目,只不过这只是系统启动时可供选择设置的一小部分,今天几种方法来实现对计算机开机启动程序的可选控制. 所需软件 1Autoruns 2QQ安全管家 END 直观处理法. 1首先检查开始菜单中启动项目中是否有相关开机启动的软件设置,如有则安需要进行删除. 2 END 利用系统配置功能实现 1开始运行 msconfig 回车. 2 3进行系统配置对话框,选择

tomcat-idea下启动项目报错,但是在eclipse下启动运行正常

问题描述 idea下启动项目报错,但是在eclipse下启动运行正常 idea下启动项目报错,但是在eclipse下启动运行正常,用的tomcat,报错信息如下,求解答!不知道有什么问题,搞了一早上也没有解决! 解决方案 tomcat可以正常启动但是在Eclipse下不可以正常启动IDEA 下启动tomcat报错IDEA启动Tomcat报错