java - 无法找到或加载从 Linux 终端调用的主类

标签 java linux terminal twilio javac

我正在 CentOS 7 终端上使用 javac 编译 java 程序。该程序非常简单,正在用于一些测试。但它抛出一个 could not find or load main class 错误,如下所示。我该如何解决这个错误?

这是背景:

java程序位于/home/user/javacode/,它用作依赖的两个jar文件位于/home/user/javacode/dependencies 。尝试编译和运行它的终端命令和响应是:

[user@domain javacode]$ javac -cp .:/home/user/javacode/dependencies/twilio-java-sdk-3.4.5.jar:/home/user/javacode/dependencies/httpcore-4.1.2.jar SendText.java
[user@domain javacode]$ java -cp .:/home/user/javacode/dependencies/twilio-java-sdk-3.4.5.jar:/home/user/javacode/dependencies/httpcore-4.1.2.jar mainpackage.SendText xxxxxxxxxx HelloThere
Error: Could not find or load main class name.of.package.SendText

是编译语法有问题,还是调用语法有问题?注意,xxxxxxxxxxHelloThere是两个args 被调用时发送到程序。 xxxxxxxxxx 是将短信发送到的电话号码,HelloThere 是消息。 (该代码经过测试,如果编译并正确运行,则确实会发送文本。)

SendText.java 包含 6 个导入,如下所示:

import com.twilio.sdk.TwilioRestClient;
import com.twilio.sdk.TwilioRestException;
import com.twilio.sdk.resource.factory.MessageFactory;
import com.twilio.sdk.resource.instance.Message;
import org.apache.http.NameValuePair;
import org.apache.http.message.BasicNameValuePair;  

我检查了,所有 6 个导入都位于以下两个 jar 中,我也在上面的命令中指定了它们:

/home/user/javacode/dependencies/twilio-java-sdk-3.4.5.jar
/home/user/javacode/dependencies/httpcore-4.1.2.jar   

只是为了证明SendText.java中有一个main方法,nano SendText.java的结果是:

package name.of.package;

import com.twilio.sdk.TwilioRestClient;
import com.twilio.sdk.TwilioRestException;
import com.twilio.sdk.resource.factory.MessageFactory;
import com.twilio.sdk.resource.instance.Message;
import org.apache.http.NameValuePair;
import org.apache.http.message.BasicNameValuePair;

import java.util.ArrayList;
import java.util.List;

public class SendText {

  public static final String ACCOUNT_SID = "arealsid";
  public static final String AUTH_TOKEN = "arealtoken";

  public static void main(String[] args) throws TwilioRestException {
    TwilioRestClient client = new TwilioRestClient(ACCOUNT_SID, AUTH_TOKEN);
    String to = args[0];
    String body = args[1];
    // Build a filter for the MessageList
    List<NameValuePair> params = new ArrayList<NameValuePair>();
    params.add(new BasicNameValuePair("Body", body));
    params.add(new BasicNameValuePair("To", to));
    params.add(new BasicNameValuePair("From", "+11234567654"));

    MessageFactory messageFactory = client.getAccount().getMessageFactory();
    Message message = messageFactory.create(params);
    System.out.println(message.getSid());
  }
}  

根据@Tyler 的评论,我输入了以下内容并得到了以下回复:

[user@domain javacode]$ ls -al
total 12
drwxrwxr-x  3 user user   66 Aug 21 21:19 .
drwxr-xr-x. 6 user user 4096 Aug 21 21:20 ..
drwxrwxr-x  2 user user   63 Aug 21 21:24 dependencies
-rw-rw-r--  1 user user 1495 Aug 21 21:27 SendText.class
-rw-r--r--  1 user user 1313 Aug 21 19:28 SendText.java
[user@domain javacode]$ java -version
java version "1.7.0_75"
OpenJDK Runtime Environment (rhel-2.5.4.2.el7_0-x86_64 u75-b13)
OpenJDK 64-Bit Server VM (build 24.75-b04, mixed mode)
[user@domain javacode]$ javac -version
javac 1.7.0_75
[user@domain javacode]$ java SendText
Exception in thread "main" java.lang.NoClassDefFoundError: SendText (wrong name: name.of.package/SendText)
at java.lang.ClassLoader.defineClass1(Native Method)
at java.lang.ClassLoader.defineClass(ClassLoader.java:800)
at java.security.SecureClassLoader.defineClass(SecureClassLoader.java:142)
at java.net.URLClassLoader.defineClass(URLClassLoader.java:449)
at java.net.URLClassLoader.access$100(URLClassLoader.java:71)
at java.net.URLClassLoader$1.run(URLClassLoader.java:361)
at java.net.URLClassLoader$1.run(URLClassLoader.java:355)
at java.security.AccessController.doPrivileged(Native Method)
at java.net.URLClassLoader.findClass(URLClassLoader.java:354)
at java.lang.ClassLoader.loadClass(ClassLoader.java:425)
at sun.misc.Launcher$AppClassLoader.loadClass(Launcher.java:308)
at java.lang.ClassLoader.loadClass(ClassLoader.java:358)
at sun.launcher.LauncherHelper.checkAndLoadMain(LauncherHelper.java:482)
[user@domain javacode]$ java name.of.package.SendText
Error: Could not find or load main class name.of.package.SendText

最佳答案

我做了一个简单的测试,复制了 OP 演示的错误:

测试.java

package com.github.example;

public class Test{
  public static void main(String args[]){
    System.out.println("hello world");
  }
}

编译: javac测试.java

像OP一样运行:

java com.github.example.Test
Error: Could not find or load main class com.github.example.Test

像没有包名的OP一样运行:

java Test
Exception in thread "main" java.lang.NoClassDefFoundError: Test (wrong name: com/github/example/Test)
    at java.lang.ClassLoader.defineClass1(Native Method)
    at java.lang.ClassLoader.defineClass(ClassLoader.java:800)
    at java.security.SecureClassLoader.defineClass(SecureClassLoader.java:142)
    at java.net.URLClassLoader.defineClass(URLClassLoader.java:449)
    at java.net.URLClassLoader.access$100(URLClassLoader.java:71)
    at java.net.URLClassLoader$1.run(URLClassLoader.java:361)
    at java.net.URLClassLoader$1.run(URLClassLoader.java:355)
    at java.security.AccessController.doPrivileged(Native Method)
    at java.net.URLClassLoader.findClass(URLClassLoader.java:354)
    at java.lang.ClassLoader.loadClass(ClassLoader.java:425)
    at sun.misc.Launcher$AppClassLoader.loadClass(Launcher.java:308)
    at java.lang.ClassLoader.loadClass(ClassLoader.java:358)
    at sun.launcher.LauncherHelper.checkAndLoadMain(LauncherHelper.java:482)

按照@Javy的建议,我创建了目录结构

com/github/example

并将Test.class放入其中。然后:

mv Test.class com/github/example/
java com.github.example.Test
hello world

关于java - 无法找到或加载从 Linux 终端调用的主类,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32151520/

相关文章:

php - 如何使用不同版本的cakephp?

python - 使用 pexpect/bash 时防止换行

java - 使用Java在命令行中执行多个命令

java - 更改 editText 字段内的可绘制图像

java - Apache Pivot 桌面应用程序中的菜单栏不可见

java - Jeromq 最大套接字打开问题

linux - BASH =~ 包含子串 : "+" or a regex character behavior

java - JUnit测试类顺序

linux - 获取字符的键盘扫描码

python - 从 python 脚本运行终端命令 (Linux)