无法找到或加载从 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
是编译语法的问题,还是调用语法的问题?注意xxxxxxxxxx
和HelloThere
是两个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
我正在使用 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
是编译语法的问题,还是调用语法的问题?注意xxxxxxxxxx
和HelloThere
是两个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