java - generate - maven-dependency-plugin
¿Es el mecanismo de versiones forzado de plataforma la característica más necesitada de Java? (5)
La ventaja que tiene .NET sobre Java es que las bibliotecas están más vinculadas 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.
Como desarrollador, a menudo me interesa la nueva función de idioma 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.
Sin embargo, cuando miro hacia atrás a casi una década trabajando en la plataforma Java, encuentro que los problemas relacionados con las versiones son el mayor culpable de los esfuerzos improductivos e innecesariamente gastados. 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 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 como resultado varias herramientas como Maven , ivy , One Jar , Jar Jar Links (¡no es broma!), Ni siquiera apropiadamente llamadas Jar Hell, etc. Incluso si usa algunas de estas herramientas, 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 todo el infierno 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 es necesario algún mecanismo de control de versiones básico y aplicado por plataforma
.NET admite conjuntos lado a lado, 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 tienes varios niveles de cargador de clases por cierto y puedes hacer algunos trucos simulando versiones similares
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 los archivos jar, y diferentes archivos con los mismos nombres (por ejemplo: versiones de log4j.jar ) Fue un desastre horrible, incluyendo una GUERRA que tenía el tarro de WebLogic dentro .
No estoy seguro de cuál es la solución.
La cosa es: Java tiene cosas para administrar esto - archivos jar estampados con versiones de paquetes. 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, especifica las dependencias de la 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 muchos sistemas (p. Ej., Maven) para administrar lugares bien conocidos desde los que descargar bibliotecas, así como también aplicaciones y otras cosas.
También he estado usando Java durante más de una década, pero debo decir que no he encontrado muchos problemas con JAR (¡incluso usando todas las herramientas de terceros que mencionas)! Encontré a Maven
como una herramienta horrible, así que construye todo con ant
.
En nuestra empresa, tenemos una tarea ant
resolución de dependencia basada en un archivo de dependencia simple (pequeño) para cada proyecto, junto con la definición de cada proyecto como una app
o una lib
(solo debe depender de una lib
, nunca una app
) Funciona bien.
También tenemos tareas ant
para modificar nuestros .classpath
eclipse .classpath
e IDEA .iml
para generar gráficos de dependencia para nuestros IDEs.
Eche un vistazo a OSGi: trata muy bien el control de versiones y la administración de paquetes.
TAMBIÉN: Eclipse (que está construido sobre OSGi) tiene algunas herramientas de API relativamente nuevas que pueden ayudarte a comparar tu API con una referencia previa y a determinar cómo expresar adecuadamente el próximo número de versión de tus paquetes.
El esquema de control de versiones de eclipse general:
v.m.n.q
dónde
v: versión de alto nivel: los cambios aquí representan, en general, cambios bruscos en la API
m: cambios importantes: nueva funcionalidad, nueva API
n: cambios menores - misma API, cambios detrás de escena
q: calificador: útil para marcar compilaciones, alfa / beta, etc.
OSGi especifica dependencias de versión que usan 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 del paquete com.javadude.foo, hasta la versión 2.0.0 (pero sin incluirla).
También puede especificar dependencias en el nivel del paquete.