我有2个基本程序。第一个名为ext.java
,第二个名为send.java
。要发布的内容位于名为data
的文件中
我使用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();
}
}
答案 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
中的所有条目添加到类路径以及编译类的路径。