2009-06-26 13 views
5

He estado leyendo Liang's Introduction to Java Programming por un par de semanas, y esa pregunta surgió cuando el autor dijo "No hay necesidad de que los desarrolladores creen, y para que los usuarios instalen, las principales versiones de software nuevas".¿Cómo funciona la actualización de software?

¿Cómo funciona la actualización de software? Por ejemplo, parches para juegos, nueva versión de productos y ese tipo de cosas. En el libro, hay un ejemplo de que, siempre que mantenga una interfaz de una clase igual, no necesita hacer ningún cambio en ninguna de las clases que dependen de la que ha cambiado. Está bien, pero aún es un poco abstracto (por ejemplo, ¿cómo creo un parche de actualización solo con esa clase?).

También estoy interesado en libros sobre el tema.

Gracias.

Respuesta

3

Tenga una mirada en el libro

Practical API Design - Confessions of a Java Framework Architect (Jaroslav Tulach, Apress, 2008)

Creo que cubre la mayor parte de los aspectos que estás preguntando.

Para el tema sobre el envío de nuevas versiones de software o actualizaciones, eche un vistazo a la tecnología Java Web Start por ejemplo.

El envío de una actualización a una aplicación web podría considerarse implícito ante los usuarios ya que los cambios realizados en un servidor centralizado son entregados por el propio navegador web.

o un conjunto de servidores

0

Considere un juego que ha sido diseñado para tener una serie de módulos independientes, cada uno interactuando entre sí a través de interfaces solamente. El despliegue inicial de dicho juego podría consistir en 15 o 20 archivos jar individuales.

Aplicar las actualizaciones sería una cuestión de conectarse a un servidor, consultar la última versión de cada archivo jar, comparar con el archivo jar que ya tiene y descargar solo los archivos modificados.

Una versión pobre de esto sería si estuvieras trabajando en un proyecto que tiene 15 jarras, y harías una corrección crítica de fallas en uno de los frascos. No tendrías que copiar los 15 frascos al sistema de tu cliente; no copiarás el que cambió.

jnlp (de los cuales Webstart y la nueva implementación de applet son ejemplos) lo hace utilizando un archivo xml bien definido para definir qué versiones de cada biblioteca se requieren. En este caso, la implementación inicial de la aplicación se puede realizar leyendo el xml (servido por un servidor web) y descargando dinámicamente los archivos jar necesarios a una memoria caché local durante una operación de arranque. En realidad, no hay una instalación inicial en absoluto.

Probablemente sea importante mencionar que este beneficio, si bien es válido y real, es bastante menor en comparación con la facilidad de mantenimiento y la codificación que proviene de la reducción de dependencias entre módulos y el uso de interfaces bien definidas.

0

La manera más simple de actualizar una sola clase será detener la aplicación, anular la clase anterior con la nueva y luego reiniciar. Apagar la aplicación puede no ser apropiado para algunos casos. Para superar esto necesitarás tener un framework/contenedor de algún tipo y desarrollar tus propios cargadores de clases que hagan posible la actualización de una clase sin reiniciar. Esto es lo que hacen los servidores de aplicaciones Java.

Para el escritorio/clientes gruesos, hay disponibles algunas soluciones comerciales y gratuitas para actualizaciones de software. Consulte esto article para una comparación. Es bastante antiguo, las nuevas soluciones están destinadas a estar disponibles.

2

Creo que el concepto que está tratando de entender es el uso de una interfaz como tipo. En un programa Java, se puede declarar que una variable tiene el tipo de alguna interfaz definida. Las clases que implementan esa interfaz se pueden instanciar para variables del tipo de interfaz. Sin embargo, solo se pueden usar métodos declarados en la interfaz. En tiempo de compilación, la interfaz se usa para verificar tipos. Sin embargo, en tiempo de ejecución, el bytecode que realmente hace el trabajo proviene del implementador de la interfaz. Un ejemplo:

public interface foo { 
    public void bar(); 
} 

public class A implements foo { 
    public void bar() { 
     // some code 
    } 
} 

public class Example { 
    public static void main(String[] args) { 
     foo aFoo = new A(); 
     aFoo.bar(); 
    } 
} 

En el Ejemplo de clase, una variable llamada afoo se declara a ser de tipo foo, la interfaz. A, que implementa la interfaz foo, contendrá el código para hacer el trabajo de method bar(). En la clase Ejemplo, la variable aFoo obtiene una instancia de la clase A, de modo que cualquier código que esté en el método bar() de A se ejecutará cuando se invoque aFoo.bar() aunque aFoo se declare de tipo foo.

Por lo tanto, hemos establecido que todo el trabajo se realiza en la clase A. Las dos clases y una interfaz anterior se pueden definir en su propio archivo. Los tres archivos .class resultantes se pueden empaquetar en un contenedor y enviarse a los clientes como la versión 1.0 del programa. Algún tiempo después, se podría descubrir un error en la implementación de bar() en la clase A. Una vez que se desarrolla una solución, suponiendo que los cambios están contenidos dentro del método bar(), solo se debe enviar el archivo .class para A clientes. La clase A. actualizada se puede insertar en el archivo .jar del programa (después de todo, los archivos .jar son solo archivos .zip) sobrescribiendo la versión anterior y sin formato de A.class. Cuando se reinicia el programa, la JVM cargará la nueva implementación de A.bar() y la clase Ejemplo obtendrá el nuevo comportamiento.

Como con casi todo, los programas más complicados pueden ser más complicados. Pero los principios son lo mismo.

0

Además de actualizar archivos JAR individuales (o, en otros entornos de software, archivos de bibliotecas compartidas o DLL), hay herramientas de parches binarios que se pueden usar en algunos casos para transmitir un conjunto de cambios al archivo base. Un programa de parche tomará este archivo de diferencia y lo fusionará con el archivo base para producir el nuevo archivo modificado. Esto solo funciona si el archivo original no se modifica en el sistema instalado, pero puede funcionar en algunos casos para parchear de forma incremental los componentes de un programa en particular.

0

De hecho, estudié marginalmente esto en la universidad, y después de una investigación específica para él, en realidad lo encontré bastante interesante. Una cosa para hacer para especificar actualizaciones específicamente es el control de versiones donde para cada versión que publicas especifica qué se ha actualizado. Digamos, por ejemplo, que la diferencia entre la versión 1.0.1 y la 1.0.2 es que mylib.dll se ha actualizado. Ahora diga que la diferencia entre 1.0.2 y 1.0.4 es que myotherlib.dll ha cambiado, y si alguien actualiza su software a la última versión (1.0.4) y actualmente tiene 1.0.1, ambos dll están incluidos en la actualización. .

No estoy seguro de si esto se practica o si se usan métodos más inteligentes. Realmente depende del fabricante del software, se usan bastantes métodos diferentes, supongo que algunos desarrolladores cifran los archivos de la aplicación y los agrupan en un formato personalizado.

0

Aquí hay un actualizador automático de archivo por lotes simple para empezar con el concepto ... Puede ejecutarlo en segundo plano y usarlo para actualizar los archivos en lugar de escribirlo en Java, me resulta más fácil escribir en C++ aunque.

@echo off 
if not exists "file.jar" goto FM 
cls 
echo [1] Update 
echo [2] Exit 
set /p "main=1OR2:" 

if %main% == 1 goto U 
if %main% == 2 exit 

:U 
cls 
echo Updating... 
del "file.jar" 
wget "http://yourserver.com/file.(EXTENSION)" 
if not exists "file.jar" goto FM 
cls 




:FM 
cls 
echo You are missing important files! 
pause >nul 
exit 

Aconsejo que se aprende cómo hacer esto en Java, pero si usted quiere conseguir más avanzadas que puede poner un archivo en el servidor denominado "Version.bat" y luego descargar eso también a la computadora portátil usuarios para que pueda leerlo y si es la misma versión que la que tienen, se saltará la descarga y dirá ¡Tienes la versión de prueba advalible !.

NOTA: para este código tiene que ir en Google y buscar wget, descargue el archivo apropiado y poner en la misma carpeta que el código anterior, también guardar el código anterior como (anything.bat)

Cuestiones relacionadas