《Javac、Java、Jar命令》第三篇

这篇随笔主要写启动 jar 时,如果需要依赖其他的 jar 包该怎么处理,我会以 rabbitMQ 客服端启动为例。

package com.rockcode.www.rabbitmq;

import java.io.IOException;
import java.util.concurrent.TimeoutException;
import com.rabbitmq.client.AMQP;
import com.rabbitmq.client.Channel;
import com.rabbitmq.client.Connection;
import com.rabbitmq.client.ConnectionFactory;
import com.rabbitmq.client.DefaultConsumer;
import com.rabbitmq.client.Envelope;

public class Consumer {
    private final static String QUEUE_NAME = "rock";

    public static void main(String[] args) {

        ConnectionFactory factory = new ConnectionFactory();
        factory.setUsername("guest");
        factory.setPassword("guest");
        factory.setHost("localhost");

        Connection conn;
        try {
            conn = factory.newConnection();
            Channel channel = conn.createChannel();
            channel.queueDeclare(QUEUE_NAME, false, false, false, null);
            System.out.println(" [*] Waiting for messages. To exit press CTRL+C");

            com.rabbitmq.client.Consumer con = new DefaultConsumer(channel) {
                  @Override
                  public void handleDelivery(String consumerTag, Envelope envelope,
                                             AMQP.BasicProperties properties, byte[] body)
                      throws IOException {
                    String message = new String(body, "UTF-8");
                    System.out.println(" [x] Received ‘" + message + "‘");

                        try {
                            doWork(message);
                        } catch (InterruptedException e) {
                            e.printStackTrace();
                        }
                      finally {
                        System.out.println(" [x] Done");
                      }

                  }
                };

            channel.basicConsume(QUEUE_NAME, true, con);

        } catch (IOException e) {
        } catch (TimeoutException e) {
        }

    }

    private static void doWork(String task) throws InterruptedException {
        for (char ch: task.toCharArray()) {
            if (ch == ‘.‘) Thread.sleep(1000);
        }
    }

}

客服端依赖 amqp-client-5.0.0.jar 和 slf4j-api-1.7.25.jar,先看看 MANIFEST.MF 文件

再看看目录结构

lib 下面就是所依赖的 jar 文件 amqp-client-5.0.0.jar 和 slf4j-api-1.7.25.jar。

我们在打开 CMD,先设置路径 set CP=.;lib/amqp-client-5.0.0.jar;lib/slf4j-api-1.7.25.jar;再执行 java -cp %CP% -jar consumer.jar

[x] Received ‘hello.‘
[x] Done

没错,收到了消息。但是上面有报错, Failed to load class "org.slf4j.impl.StaticLoggerBinder".

我们将 slf4j-nop-1.7.21.jar 加入 lib 目录下,重新设置路径,set CP=.;lib/amqp-client-5.0.0.jar;lib/slf4j-api-1.7.25.jar;lib/slf4j-nop-1.7.21.jar;

同时修改 MANIFEST.MF 文件

再试下 java -cp %CP% -jar consumer.jar

这样就没问题了。

下一篇我会将 producer 和 consumer 分别打包成 jar,通过命令行和脚本来执行,谢谢大家,希望有所帮助!

原文地址:https://www.cnblogs.com/xums/p/9285961.html

时间: 2024-10-17 18:39:17

《Javac、Java、Jar命令》第三篇的相关文章

HttpApplication处理对象与HttpModule处理模块 (第三篇)

一.HttpApplication对象简述 在HttpRuntime创建了HttpContext对象之后,HttpRuntime将随后创建一个用于处理请求的对象,这个对象的类型为HttpApplication. HttpRuntime管理一个定义在System.Web命名空间下的HttpApplicationFactory类的时候,HttpApplicationFactory通过工厂模式管理HttpApplication对象.在HttpApplicationFactory内部维护了一个HttpA

Python之路【第三篇】:Python基础(二)

Python之路[第三篇]:Python基础(二) 内置函数 一 详细见python文档,猛击这里 文件操作 操作文件时,一般需要经历如下步骤: 打开文件 操作文件 一.打开文件 1 文件句柄 = file('文件路径', '模式') 注:python中打开文件有两种方式,即:open(...) 和  file(...) ,本质上前者在内部会调用后者来进行文件操作,推荐使用 open. 打开文件时,需要指定文件路径和以何等方式打开文件,打开后,即可获取该文件句柄,日后通过此文件句柄对该文件操作.

SylixOS ARM BSP 第三篇【bspInit.c】

此篇博客为 SylixOS ARM BSP 编写连载的第三篇,主要介绍 bspInit.c 文件具体实现. bspInit.c 为 BSP 操作系统初始化部分代码,通常由 startup.S 初始完基本处理器参数后调用,下面以 S3C2440A 处理器为例,逐块介绍 bspInit.c 代码. SylixOS ARM BSP 第二篇中提到 startup.S 初始化完成会将会调用 bspInit() 函数,此函数用于初始化操作系统,并开始多任务调度. int bspInit (void) {  

谷歌的三篇论文

传说中的谷歌三篇论文 MapReduce: Simpli?ed Data Processing on Large Clusters The Google file system Bigtable: A Distributed Storage System for Structured Data 谷歌学术立搜可下,每日潜心研习,假以时日,便可大成.

认识元数据和IL(上) <第三篇>

说在,开篇之前 很早就有说说Metadata(元数据)和IL(中间语言)的想法了,一直在这篇开始才算脚踏实地的对这两个阶级兄弟投去些细关怀,虽然来得没有<第一回:恩怨情仇:is和as>那么迅速,但是Metadata和IL却是绝对重量级的内容,值得我们在任何时间关注,本文就是开始. 1 引言 你可曾想到,我们的C#代码,编译之后究竟为何物?你可曾认知,我们的可执行程序,运行之时的轨迹究竟为哪般?那么,本文通过对Metadata(元数据)和IL(Intermediate Language, 中间语

编写小游戏《贪头蛇》第三篇

源码下载地址:http://download.csdn.net/detail/oyangyufu/7492917 点击NEW GAME按钮,进入游戏主场景 代码: 游戏背景 layer = (CCLayer*)this->getChildren()->objectAtIndex(SnakeConstants::LAYER_BACKGROUND); layer->setTouchEnabled(false); //游戏背景 CCSize size = CCDirector::sharedD

ORA-38760: This database instance failed to turn on flashback database 第三篇

ORA-38760: This database instance failed to turn on flashback database  第三篇 第一篇 第二篇 问题现象: 在数据库alert告警日志中看见例如以下信息: Completed: ALTER DATABASE MOUNT Wed Nov 19 04:57:28 2014 alter database open Errors in file /DBSoft/diag/rdbms/woo/woo/trace/woo_ora_593

第三篇 读后感

      今天读了大道至简中的第三篇关于团队缺乏的不只是管理的文章,其中作者引用了<汉书>中的“言人三人众”,来说明团队是至少以三个人为规模的,而三人构成的团队,这样便具备了团队的一些基本特征:主从.监督和责任.团队并不是个体能够组成的,两个人同样不能成为一个团队,两人则互相支撑,正如古文中“从”字是二人互立的,并没有监督.老师课上所说的一个和尚有水喝,两个和尚抬水喝,三个和尚没水喝的故事,三个和尚之所以没水喝是因为没有能够的安排没有领导人,三个人本能比一个人有更高的效率,正如文中所说的的一

学习KnockOut第三篇之List

欲看此篇---------------------------------------------可先看上篇. 第一步,先搭建一个大概的框架起来.至于绑定什么的,我们稍后慢慢进行.可能会有人问为什么我那个位置要写一个form,关于这个呢,且埋一伏笔,稍后说明原由. 我们要做的是,当点击“Add”按钮时能将文本框里的值加入的下拉框里,当我们选中下拉框里的选项时点击"Remove"也能进行删除操作,同样,当点击“Sort”时也能对下拉框里的选项进行排序.有代码和图: 1 <!DOCT

LoadRunner用户行为模拟器 《第三篇》

用户行为模拟器简称VU,VU通过运行VU脚本模拟了用户对软件的操作行为.VU是基于网络协议的.很明显,被测服务器是通过各种各样的网络协议与客户端打交道的.VU要"骗过"被测服务器,当然就要遵守这些协议,按规矩.按步骤来执行动作,否则就会吃"闭门羹". 基于网络协议的脚本的一个好处是,我们可以使用相对少的硬件资源,来生成大量的虚拟用户负载.相比之下,WinRunner和QTP脚本时基于界面事件的,它在一台主机上同时只能运行一个虚拟用户的脚本,因为一个虚拟用户会占用整个