2010-06-22 17 views
9

¿Y cuál es la desventaja de usar del profesional?¿Cuál es la diferencia entre las bibliotecas de tiempo de compilación y las bibliotecas de tiempo de ejecución en Java?

Realmente lo vi en Netbeans en Propiedades del proyecto> Bibliotecas para aplicaciones Java. Tenemos dos pestañas, una para las bibliotecas de tiempo de compilación y bibliotecas de tiempo de ejecución, y parece que podemos añadir una biblioteca a cualquiera independientes entre sí

+1

¿Quién le dijo que tiene esa opción en Java? –

+0

tal vez le confunde la distinción entre classpaths en tiempo de compilación y en tiempo de ejecución? – akf

+0

@ Nikita/akf De hecho, lo vi en Netbeans en Propiedades del proyecto> Bibliotecas para aplicaciones Java. Tenemos dos pestañas, una para las bibliotecas de tiempo de compilación y las bibliotecas de tiempo de ejecución, y parece que podemos agregar una biblioteca a cualquiera de ellas, independientemente – jonasespelita

Respuesta

7

La interfaz de usuario y la terminología del diálogo de propiedades de Bibliotecas es bastante confuso.

El botón de Ayuda en ese diálogo le dará un poco de información.

La lista de bibliotecas en tiempo de compilación puede ser un subconjunto de la lista de bibliotecas en tiempo de ejecución.

considerar esta situación ...

Tiene código fuente que importa las clases a partir de una biblioteca 'widgets.jar'. Los archivos de clase en widgets.jar símbolos de referencia del archivo jar 'xml.jar'. Si su código fuente no importa clases de xml.jar, puede definir la lista de bibliotecas de tiempo de compilación para contener solo widgets.jar.

Cuando intente ejecutar su proyecto, probablemente necesite incluir xml.jar en la lista de bibliotecas en tiempo de ejecución para evitar ClassNotFoundException.

+0

Esto era lo que estaba buscando. ¡Gracias! – jonasespelita

+0

@Alpine: a veces. Incrustar una pregunta en los comentarios en StackOverflow realmente frustra el propósito de StackOverflow. El uso de http://stackoverflow.com/questions/ask para hacer una pregunta probablemente obtenga una mejor respuesta de una mayor cantidad de contestadores. – vkraemer

11

No hay tal cosa como las bibliotecas de tiempo de compilación vs. tiempo de ejecución bibliotecas

Quizás esté mezclando algunos conceptos.

En Java, las bibliotecas que se utilizarán se validarán estáticamente en tiempo de compilación y también se validarán en el tiempo de ejecución.

Por ejemplo, si desea utilizar IterableMap especificado en la biblioteca Apache Collections. El compilador valida "en tiempo de compilación" está invocando un método que existe en esa clase.

Pero el compilador no enlaza ni hace mucho de nada con esa biblioteca, igual la necesita en tiempo de ejecución. Por lo tanto, cuando se ejecuta el código, el tiempo de ejecución de Java busca nuevamente esa clase e invoca el método que el compilador comprobó que existe.

Y eso que hay.

+0

Gracias por la información. Pero qué abt reflexiones? Si tratamos de usar una clase usando reflexión, el compilador no se quejará, ¿verdad? Algo así como [esto] (http://www.java-tips.org/java-se-tips/java.lang.reflect/invoke-method-using-reflection.html) – bdhar

+3

@bdhar - la reflexión es solo una forma diferente de hacer cosas que mueve la validación incluso más tarde que la carga de la clase. El compilador no sabe nada sobre el tipeo de los métodos que se invocan de esta manera, pero el sistema de tiempo de ejecución (específicamente las API de reflexión) garantiza que no ocurra nada inseguro. –

+0

Gracias Stephen ... – bdhar

0

Como han dicho otros, usted está confundiendo conceptos. Creo que lo que realmente estás tratando de entender es a qué se refiere Maven como dependency scope. A veces solo necesita una dependencia en tiempo de compilación porque espera que se proporcione en tiempo de ejecución, y en ocasiones la necesita en tiempo de ejecución pero no en tiempo de compilación.

1

Quizás, esto entra en juego cuando desea cargar una biblioteca dinámicamente, o verificar la existencia de la biblioteca y luego ejecutar el código.

Durante la compilación, el compilador necesita saber cuáles son las firmas de los métodos, clases, etc. para saber si el código es correcto. Por lo tanto, agrega la biblioteca de tiempo de compilación.

Durante el tiempo de ejecución, JVM aún necesita la biblioteca para ejecutar ese código específico. Pero puede poner una lógica para evitar ese código comprobando si la biblioteca existe, por ejemplo, al hacer el método Class.for(). Es posible que algunas bibliotecas ya existan en el sistema (por ejemplo, qt.jar) o que no, y puede verificar y ejecutar su código en consecuencia.

Corrija esta respuesta si me equivoco.

Cuestiones relacionadas