2009-02-20 13 views
8

Como desarrollador, a menudo me interesa la característica de idioma nuevo que puede hacer su vida más fácil. Por ejemplo, java 5 trajo genéricos y anotaciones al lenguaje, características que definitivamente pueden aumentar su productividad.¿Es el mecanismo de control de versiones más necesario de Java?

Sin embargo, cuando miro hacia atrás a casi una década de trabajo en la plataforma Java, encuentro que los problemas relacionados con las versiones son el mayor culpable del esfuerzo improductivo e innecesariamente gastado. Horas y horas de buscar la versión correcta del contenedor, tratando de conciliar algún conflicto de versiones, actualizar bibliotecas dependientes, etc. Cuando comencé a trabajar en Java, las cosas no eran tan difíciles, tendrías algunas bibliotecas de terceros y eso es todo . Hoy en día, su aplicación web típica podría usar fácilmente: Spring Framework, Hibernate, Struts, lo que sea. Todos estos llevan una cantidad de bibliotecas de terceros dependientes. Hoy, mis archivos de oído generalmente incluirán unas 40 o más bibliotecas de terceros. ¡Un verdadero infierno!

Con las anotaciones, no tengo que administrar los archivos de configuración para Hibernate, por ejemplo. Una buena característica, pero no he visto tantos problemas derivados del hecho de que guardo mis descripciones en un archivo separado. Con los genéricos, me libero de escribir sentencias de elenco, pero en todo mi soporte de programación no puedo recordar un solo error que podría haberse evitado usando un contenedor tipo seguro. ¿No habría sido mucho más valiosa la solución a los problemas de control de versiones?

Todos estos problemas han dado lugar a varias herramientas como Maven, ivy, One Jar, Jar Jar Links (no es broma!), Incluso el apropiado nombre Jar Hell etc. Incluso si utiliza algunas de estas herramientas, que está lejos de ser inmune a la problema. Uso Maven 2 y ha sido de gran ayuda. Aún así, es un mundo en sí mismo. El programador principiante puede tardar un tiempo en aprenderlo. Mover sus proyectos heredados a la estructura de Maven también es un problema.

Parece que en .Net han aprendido la lección con dll hell y la administración de ensamblados .Net es mucho más simple.

Parece que hay planes para resolver este problema para la plataforma Java y alternativas como OSGI. Creo que se necesita urgentemente algún mecanismo de versión básico y aplicado a la plataforma

+0

Esto parece más un comentario que una pregunta. – cletus

+0

Supongo que es un poco de ambos (un comentario y una diatriba). Básicamente quería ver si otros compartían los mismos problemas que yo. Desde hace años, esta ha sido la necesidad más apremiante para mi equipo y me siento frustrado por la falta de una solución eficiente para este problema. – Dan

+0

Rant o no, sigue siendo una pregunta legítima. Al menos el título es incluso si la pregunta no se repite en el cuerpo de la publicación. – tvanfosson

Respuesta

4

echar un vistazo a OSGi - se trata de versiones y la gestión de paquetes (tarros) muy bien.

TAMBIÉN: Eclipse (que está construido sobre OSGi) tiene algunas herramientas API relativamente nuevas que pueden ayudarlo a comparar su API con una referencia previa y determinar cómo expresar adecuadamente el siguiente número de versión de sus paquetes.

El esquema general del eclipse de versiones:

v.m.n.q 

donde

v: Versión de alto nivel - cambios aquí representan generalmente rompiendo cambios en la API

m: principales cambios - nueva funcionalidad, nueva API

n: cambios menores - misma API, cambios entre bastidores

q: calificador: útil para marcar compilaciones, alfa/beta, etc.

OSGi especifica las dependencias de versión que utilizan rangos.Por ejemplo

Require-Bundle: com.javadude.foo;bundle-version="[1.2.0,2.0.0)" 

en su MANIFEST.MF especifica que el paquete requiere la versión 1.2.0 o posterior de com.javadude.foo paquete, a través de (pero no incluyendo) la versión 2.0.0.

En su lugar, también puede especificar dependencias en el nivel del paquete.

+0

Conozco OSGI pero no lo he visto con más detalle. Tuve la impresión de que podría ser excesivo para un problema en particular al que me enfrento. Supongo que es hora de echarle un segundo vistazo. – Dan

+0

en realidad es bastante liviano. en su versión más básica, puede usarlo para administrar dependencias de paquetes. también puede usarlo para proporcionar servicios para otros paquetes. –

0

La ventaja que tiene .NET sobre Java es que las bibliotecas están más ligadas al sistema operativo. El hecho de que las bibliotecas de marcos, si están instaladas, están ubicadas fácilmente en el GAC, simplifica las cosas, pero también está limitado a Windows. Una mejor comparación sería Mono, pero no tengo ninguna experiencia allí.

La gestión de la configuración, al menos para mí, siempre ha sido un gran problema para el desarrollo de software. Mientras más trate de aprovechar el código existente, peor se volverá. El problema en sí mismo no es exclusivo de Java, pero la proliferación de versiones, la cantidad de tiempo que la plataforma ha estado presente y la cantidad de plataformas compatibles sí lo empeora. Acabo de verificar y ahora tengo 3 versiones del JRE en mi caja, y ni siquiera soy un desarrollador activo de Java.

En cuanto a su pregunta, no estoy seguro de si es la función más urgente. Personalmente, me gustaría ver un mejor soporte para los servicios web, particularmente aquellos que requieren encabezados de autenticación. La última vez que intenté que Java interactuara con uno de mis servicios web .NET, casi me arranco el pelo. Después de haber usado LINQ con C#/.Net, también puedo decir que sería una buena adición a Java con posiblemente más ganancias de productividad.

+0

Parece que la idea detrás de JSR 277 (http://www.jcp.org/en/jsr/detail?id=277) era incluir alguna solución similar, pero parece estar latente. – Dan

+0

Creo que OSGi (http://www.osgi.org/Main/HomePage) ya ofrece muchos de los beneficios de JSR 277 con la ventaja añadida de que realmente existe. Ni siquiera es tan complicado. –

0

.NET admite conjuntos uno al lado del otro, por lo que puede tener varias versiones del mismo entorno de aplicación. El GAC es como archivos DLL compartidos, pero aún así puede registrar varias versiones del mismo ensamblado en el GAC y otro ensamblado puede solicitar una versión determinada o una versión superior si lo recuerdo bien.En JavaEE que tienen varios niveles de clase-loader por cierto y usted puede hacer algunos trucos simulación de versiones similares

+0

Pero, ¿admite tener diferentes versiones de los mismos ensamblajes en la misma vm? –

5

También he estado usando Java para más de una década, pero tengo que decir que no he encontrado muchos demonios JAR problemas en absoluto (¡incluso usando todas las herramientas de terceros que mencionas)! Encontré Maven como una herramienta horrible, así que compila todo con ant.

En nuestra empresa tenemos una medida tarea dependencia resolución ant basado en un simple (pequeño) archivo de dependencia para cada proyecto, junto con la definición de cada proyecto, ya sea como un app o una lib (sólo debe depender incluso en un lib ; nunca un app). Funciona bien.

También tenemos ant tareas para modificar nuestros archivos eclipse .classpath e IDEA .iml para generar gráficos de dependencia para nuestros IDEs.

+0

Es posible que Ivy valga la pena incorporarlo a su sistema de compilación. Básicamente toma los mecanismos de resolución de dependencia de maven mientras descarta el resto - http://ant.apache.org/ivy/ – Evan

+0

También debería mencionar que también tiene un plugin para Eclipse - http://ant.apache.org/ivy/ivyde/ – Evan

+0

Estoy tan contento de ver que no soy el único que odia a los expertos ... –

0

Me encontré con este problema en un sitio donde trabajé: construí una herramienta para ejecutar los archivos jar que viven en un servidor web y encuentro todas las copias anidadas de archivos jar y diferentes archivos con los mismos nombres (por ejemplo: versiones de log4j.jar). Fue un lío horrible, incluido un WAR que tenía el contenedor WebLogic dentro de.

No estoy seguro de cuál es la solución.

Thing es: java tiene cosas para administrar esto - archivos jar marcados con versiones de paquete. Y particularmente: webstart. Tal vez lo que se necesita es algún tipo de cargador de clases que haga algo parecido a un webstart.

Qué tal: en el manifiesto JAR, especifique las dependencias de biblioteca, utilizando nombres y versiones bien conocidos. El cargador de clases, proporcionado por el contenedor o el tiempo de ejecución, sería responsable de obtener las versiones que desee.

Hay un montón de sistemas (por ejemplo: Maven sí mismo) para la gestión de lugares conocidos para descargar bibliotecas de, así como Fink y otras cosas.

Cuestiones relacionadas