Error: no se pudo encontrar ni cargar la clase principal con OpenJDK y Oracle Java en CentOS 7

Error: no se pudo encontrar ni cargar la clase principal con OpenJDK y Oracle Java en CentOS 7

En CentOS 7.2 Linux lo descargué e instalé exitosamenteOráculo Javacon:

# rpm -Uvh jdk-8u91-linux-x64.rpm

Además ya está instalado OpenJDK:

# rpm -qa | grep -i jdk
java-1.8.0-openjdk-headless-1.8.0.91-0.b14.el7_2.x86_64
java-1.8.0-openjdk-1.8.0.91-0.b14.el7_2.x86_64
jdk1.8.0_91-1.8.0_91-fcs.x86_64

Puedo cambiar entre los 2 usando este comando:

# alternatives --config java

There are 2 programs which provide 'java'.

  Selection    Command
-----------------------------------------------
*  1 /usr/lib/jvm/java-1.8.0-openjdk-1.8.0.91-0.b14.el7_2.x86_64/jre/bin/java
 + 2 /usr/java/jdk1.8.0_91/jre/bin/java

Enter to keep the current selection[+], or type selection number:

Y mira la versión con:

# java -version
java version "1.8.0_91"
Java(TM) SE Runtime Environment (build 1.8.0_91-b14)
Java HotSpot(TM) 64-Bit Server VM (build 25.91-b14, mixed mode)

# javac -version
javac 1.8.0_91

Ahora a mi problema, por favor.

Creo un archivo java simple llamado TheClassName.java:

package thepackagename;

public class TheClassName {
        public static final void main(String[] args)  {
                System.out.println("Hello World!");
        }
}

Después de compilarlo exitosamente javac TheClassName.java(lo que produce TheClassName.classun archivo en el mismo directorio), desafortunadamente no puedo ejecutarlo:

# java -cp . thepackagename.TheClassName
Error: Could not find or load main class thepackagename.TheClassName

Aquí otro intento:

# export JAVA_HOME=/usr/lib/jvm/java-1.8.0-openjdk-1.8.0.91-0.b14.el7_2.x86_64/jre
# $JAVA_HOME/bin/java -cp . thepackagename.TheClassName
Error: Could not find or load main class thepackagename.TheClassName

Establecer otra variable de entorno tampoco ayuda:

# export CLASSPATH=.

Un comando similar en Windows 7 funciona bien y también intenté copiar el TheClassName.classarchivo desde allí a Linux.

Por favor ayude y no sugiera marcar esta pregunta como duplicada, porque como ve arriba, ya probé la mayoría de las sugerencias.

El SELINUX está apagado ( SELINUX=disabled) y el servidor fue instalado hace unas semanas, sirviendo (sin errores) como LAMP con MySQL/PostgreSQL/Apache/WordPress.

ACTUALIZAR:

Sí, tuve que mover el archivo de clase al thepackagenamedirectorio y luego funciona:

# ls thepackagename
TheClassName.class

# java -cp . thepackagename.TheClassName
Hello World!

Incluso puedo crear un test.jararchivo y todavía funciona ahora:

# zip -r test.jar thepackagename
  adding: thepackagename/ (stored 0%)
  adding: thepackagename/TheClassName.class (deflated 31%)

# java -cp test.jar thepackagename.TheClassName
Hello World!

Respuesta1

Si la clase está en un paquete:

package thepackagename;

public class TheClassName {
        public static final void main(String[] args)  {
                System.out.println("Hello World!");
        }
}

Luego, llamarlo desde el directorio incorrecto da como resultado:

Error: Could not find or load main class thepackagename.TheClassName

Debe llamarse con su nombre completo:

java -classpath . thepackagename.TheClassName

Y este comando debe ser llamado desde elmismo directorioen el que thepackagenameexiste el directorio. Esto significa que debe crear un nuevo directorio llamado thepackagenamey entrar TheClassName.classen él, luego ejecutar el comando anterior desde el directorio principal del thepackagenamedirectorio.

información relacionada