从java代码调用rabbitmq发布者

时间:2017-02-07 16:32:16

标签: java eclipse rabbitmq apache-commons

我有2个基本程序。第一个名为ext.java,第二个名为send.java。要发布的内容位于名为data的文件中

  • 第一个java程序打开命令提示符并执行第二个java 程序。
  • 然后第二个java程序将文件内容发布到rabbitmq中的队列 服务器

我使用apache commons库函数FileUtils.readFileToString(file,format)来读取文件 当我从命令行执行send.java qname filepath时,它会推送内容 但是当我从ext.java程序调用相同的命令行参数(在eclipse项目中)时,它会抛出一个异常,如下所示:

java.lang.NoClassDefFoundError: org/apache/commons/io/FileUtils

环境变量都已正确设置。这是代码文件。

ext.java

public static void main(String[] args) throws IOException {     
        File f = new File("C:\\Users\\Pradeep\\Desktop\\pros\\externalJava\\data");                 
        Runtime.getRuntime().exec("cmd.exe /c start java send f0 "+f.getAbsolutePath());
    }

send.java

import com.rabbitmq.client.*;
import org.apache.commons.io.*;
import java.io.File;

public class send {

  public static void main(String[] argv) throws Exception {
     ConnectionFactory factory = new ConnectionFactory();
    factory.setHost("localhost");
    Connection connection = factory.newConnection();
    Channel channel = connection.createChannel(); 
    File f = new File(argv[1]);
    String message = FileUtils.readFileToString(f,"UTF-8");
    channel.basicPublish("", argv[0], null, message.getBytes("UTF-8"));

    channel.close();
    connection.close(); 
  }
}

1 个答案:

答案 0 :(得分:1)

您还需要指定classpath,以便将JVM指向哪里查找FileUtils(以及rabbitmq相关类。您有相关文档https://docs.oracle.com/javase/tutorial/essential/environment/paths.html

另一种方法是创建可执行文件JAR,这样类路径就会包含在JAR的清单文件中,从而无需在CLI上指定类路径。它会像java -jar Executable.Jar

一样运行

所以试试这个:

 Runtime.getRuntime().exec("cmd.exe /c start java -cp PathToYourLibraries send f0 "+f.getAbsolutePath());

它来自eclipse,因为它为用户透明地设置了正确的类路径 - 将libraries中的所有条目添加到类路径以及编译类的路径。