无法找到或加载从 linux 终端调用的主 class

could not find or load main class called from linux terminal

我正在使用 javac 在 CentOS 7 终端编译一个 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 是要将文本发送到的 phone 号码,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个import都在下面两个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.access0(URLClassLoader.java:71)
at java.net.URLClassLoader.run(URLClassLoader.java:361)
at java.net.URLClassLoader.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

你应该根据你的 package name

创建目录

例如

package com.peng.test;
public class A {
    public static void main(String []args) {
        System.out.println("test");
    }
}

当前目录结构如下

TestJ
   --A.java

那么你应该创建目录

mkdir bin

然后使用以下 cmd

编译 A.java
javac -d bin A.java

现在目录如下

TestJ
   --A.java
   --bin
     --com
       --peng
         --test
           --A.class

然后

cd bin

然后

java com.peng.test.A

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

Test.java

package com.github.example;

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

编译: javac Test.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.access0(URLClassLoader.java:71)
    at java.net.URLClassLoader.run(URLClassLoader.java:361)
    at java.net.URLClassLoader.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