2010-02-16 10 views
25

Uso de Eclipse He creado un programa Hello World de SWT. Pude ejecutar este programa desde Eclipse y funcionó bien.¿Puedo ejecutar desde el programa de línea de comandos creado por Eclipse?

En "/ home/myname/workspace/HelloWorldSWT" encontré dos archivos: HelloWorldSWT.java y HelloWorldSWT.class. Quería ejecutar el programa correspondiente desde la línea de comando. En primer lugar he tratado de escribir "Hola Mundo java" y me dieron el siguiente mensaje de error:

Exception in thread "main" java.lang.NoClassDefFoundError: HelloWorld 
    at gnu.java.lang.MainThread.run(libgcj.so.90) 
Caused by: java.lang.ClassNotFoundException: HelloWorld not found in gnu.gcj.runtime.SystemClassLoader{urls=[file:./], parent=gnu.gcj.runtime.ExtensionClassLoader{urls=[], parent=null}} 
    at java.net.URLClassLoader.findClass(libgcj.so.90) 
    at gnu.gcj.runtime.SystemClassLoader.findClass(libgcj.so.90) 
    at java.lang.ClassLoader.loadClass(libgcj.so.90) 
    at java.lang.ClassLoader.loadClass(libgcj.so.90) 
    at gnu.java.lang.MainThread.run(libgcj.so.90) 

También probé este "java-cp/home/roman/espacio de trabajo/HelloWorld.HelloWorld". Como resultado, recibí el siguiente mensaje de error:

Exception in thread "main" java.lang.NoClassDefFoundError: loaded class HelloWorld.HelloWorld was in fact named HelloWorld 
    at java.lang.VMClassLoader.defineClass(libgcj.so.90) 
    at java.lang.ClassLoader.defineClass(libgcj.so.90) 
    at java.security.SecureClassLoader.defineClass(libgcj.so.90) 
    at java.net.URLClassLoader.findClass(libgcj.so.90) 
    at gnu.gcj.runtime.SystemClassLoader.findClass(libgcj.so.90) 
    at java.lang.ClassLoader.loadClass(libgcj.so.90) 
    at java.lang.ClassLoader.loadClass(libgcj.so.90) 
    at gnu.java.lang.MainThread.run(libgcj.so.90) 

¿Alguien sabe lo que estoy haciendo mal? Gracias de antemano por cualquier ayuda.

Respuesta

2

Es posible que no esté cargando la biblioteca SWT correctamente y, como resultado, su clase no se carga.

La biblioteca SWT forma parte de los archivos jar que ya están cargados cuando ejecuta Eclipse pero no se cargan en un parámetro de línea de comando. ¿Modificó su ruta de clase en consecuencia?

Aquí es un viejo artículo sobre cómo hacer este tipo de cosas en las versiones anteriores de Eclipse http://www.ibm.com/developerworks/opensource/library/os-ecgui1/ Tendrá diferentes frascos de hoy con la última versión fo Eclipse. Incluso podría reducirse a una sola jarra.

Echa un vistazo a SWT FAQ; al menos para Mac Carbon, puedes usar un solo frasco, apostaría que puedes hacer eso para otras plataformas.

Además, no estoy 100% seguro de que puede ejecutar Eclipse en openJDK, que parece ser el caso en su plataforma.

+0

Gracias por la respuesta. Soy un novato en Java y no entiendo la esencia. Quiero decir, me parece extraño que necesitemos usar algunas formas complicadas de ejecutar aplicaciones SWG sin Eclipse. ¿Cuál es el uso del programa escrito en Eclipse si se puede ejecutar fácilmente solo dentro de Eclipse? – Roman

+0

Si desea una aplicación de GUI fácil de ejecutar en Java, no use SWT, sino Swing. Si usa SWT, tiene que administrar sus dependencias. Al crear una aplicación RCP, la plataforma administra estas dependencias por usted, pero en el caso de los programas estándar, debe depender de los archivos SWT utilizando los classpaths. –

1

Este es el problema que se produce porque la JVM no puede encontrar la clase HelloWorld ya que tiene el nombre de la clase como HelloWorldSWT con el método principal en ella. tratar con

java HelloWorldSWT

+0

Probé "java -cp/home/roman/workspace/HelloWorldSWT.HelloWorldSWT" y "java HelloWorldSWT". Ambos no funcionaron. – Roman

66

Ir a la perspectiva de depuración, y seleccionar el programa que acaba de ejecutar (donde dice Termintated, valor de salida ... en la ficha de depuración) Haz clic derecho y seleccione Propiedades, allí puede ver todo el comando de la línea de comando que fue lanzado por eclipse.

Puede ejecutar este mismo comando en el mismo directorio eclipse (ver en Ejecutar configuraciones, Argumentos, directorio de trabajo) y funcionará.

+0

No puedo encontrar la "perspectiva de depuración". ¿Donde es? – Roman

+0

Elija agregar una perspectiva y puede elegir la depuración entre otras – Persimmonium

+1

+1. La forma más simple de encontrar el comando completo para ejecutar. Tuve que cambiar javaw.exe a java.exe, eliminé algunos switches innecesarios y funcionó a las mil maravillas. – understack

7

Debe agregar el directorio donde eclipse está almacenando el archivo HelloWorldSWT.class en classpath. Se define cuando se crea el proyecto, como "bin", "build" o "classes". Compruebe las propiedades del proyecto o busque el archivo HelloWorldSWT.class.

Suponiendo que sea el directorio build dentro del espacio de trabajo HelloWorldSWT y que su clase está en ningún paquete (paquete por defecto), el comando debe ser:

java -cp /home/roman/workspace/HelloWorldSWT/build HelloWorldSWT 

o simplemente cambiar a ese directorio y uso:

java -cp . HelloWorldSWT 

EDIT:
el -cp . significa que sólo el directorio actual se utiliza para encontrar los archivos de clase. También debe agregar todas las bibliotecas (JAR u otros directorios) utilizadas por su programa (databse, SWT, ...).
Para más detalles se puede echar un vistazo a la documentación: How Classes are Found, Setting the Classpath y java comand

+0

Encontré HelloWorldSWT.class. Se encuentra en "/ home/myname/workspace/HelloWorldSWT /". Voy a este directorio y escribo "java -cp. HelloWorldSWT". Como resultado recibo un mensaje de error: Excepción en el hilo "principal" java.lang.NoClassDefFoundError: org.eclipse.swt.widgets.Display – Roman

+0

@Roman: ese es el siguiente problema: debe agregar todas las bibliotecas necesarias al ' Variable de entorno CLASSPATH' o al argumento '-cp'; ejemplo: 'java -cp.: lib/somelib.jar: ... HelloWorldSWT'. Edité mi respuesta agregando un enlace a la documentación (estoy seguro de que la pregunta CLASSPATH se responde en otro lugar en stackoverflow.com) –

1

No ha configurado correctamente, entonces la ruta de clases.

Creo que generalmente es más conveniente tener el IDE compilando un archivo jar con todas las librerías que no están incluidas y ejecutarlo desde la línea de comandos.

java-jar myprogram.jar

What is the use of the program written in Eclipse if it can be easily executed only within the Eclipse?

eso es realmente una buena pregunta, y el despliegue de aplicaciones Java es realmente un arte en sí mismo. Tanto la compilación como la ejecución son, si no complicadas, al menos engorrosas cuando se realizan a mano. Pero Eclipse y otras herramientas como Netbeans pueden ayudarlo a realizar estas tareas de una manera fácil, e incluso empaquetar su programa para que otros que no usan estas herramientas también puedan ejecutar los programas fácilmente.

3

Me parece que usted no tiene una clase llamada HelloWorldSWT``, sino más bien una clase llamada HelloWorldSWT en un paquete denominado HelloWorldSWT (Puede confirmar esto de ir a la primera línea de HellowWorldSWT.java, donde encontrará package HelloWorldSWT;

Si es así, vaya en el directorio padre y escriba

java HelloWorldSWT.HelloWorldSWT Esto funcionaría.

+0

Funcionó para mí. Solo quería probar Hola mundo – user2963623

1

Si desea ejecutar el programa con argumentos de línea de comandos desde dentro de Eclipse se puede ir a RUN> ejecutar configuraciones, w Esto abrirá una ventana con el programa que está ejecutando, así como un cuadro donde puede ingresar argumentos.

1

Encontré otra solución rápida y sucia si solo quieres ver alguna salida en la línea de comandos. ¡Pero esto es no es una buena práctica a largo plazo!

  1. Retire la declaración del paquete en el código (Eclipse se quejará y le dará una cruz roja, ignorar que en primer lugar), por ejemplo, package hello;

  2. Guardar.

  3. Abra su línea de comando y navegue hasta que se encuentre en la carpeta src (use cd).

  4. Compila el archivo java, p.javac HelloWorld.java

  5. Ejecute el archivo de la clase java, p. java HelloWorld

que debería funcionar, siempre y cuando usted está en el directorio correcto sin ningún tipo de declaraciones de paquetes en el código! Las declaraciones de los paquetes sí causan problemas ... y Eclipse está configurado para asegurarse de que todo funcione, por eso está bien tener allí las declaraciones del paquete. Una solución alternativa es ir y establecer el classpath por su cuenta (lo cual siempre me confunde cada vez que tengo que hacerlo, lo que rara vez hago).

3

Hago algunas soluciones para aprovechar al máximo la conveniencia de Eclipse. Debajo está lo que encontré, y funcionó bien para mí. Espero que ayude: enter image description here

Cuestiones relacionadas