2012-01-30 17 views
7

Tengo una aplicación de servidor y dos aplicaciones de cliente basadas en Swing. Los estamos desarrollando en eclipse y hay un proyecto separado para cada uno.Crear clases en el mismo paquete en jar por separado

Muchas clases se comparten. Por ejemplo, el paquete my.server tiene algunas clases tanto para el servidor como para los clientes, mientras que otras son solo para el servidor. Aunque prefiero ponerlos en el mismo paquete porque están estrechamente relacionados y algunos de ellos dependen de la visibilidad del paquete, no quiero distribuir clases que una aplicación no necesita, ya que no solo inflaría el tamaño del archivo, sino que también Sería un riesgo de seguridad.

Por el momento, cada uno de los servidores y clientes tiene los mismos frascos, lo cual es un desastre. Idealmente, me gustaría crear automáticamente jar basados ​​en la dependencia de la siguiente manera.

Server:

  • server.jar: clases utilizadas por Server sólo
  • servidor cliente1-common.jar: clases compartidas por servidor y cliente 1
  • servidor client2-common.jar: clases compartidas por servidor y cliente 2

Cliente 1:

  • client1.jar: clases utilizadas por el cliente 1 solamente
  • servidor cliente1-common.jar: clases compartidas por servidor y cliente 1
  • cliente-common.jar: clases compartidas por el cliente 1 y el cliente 2, pero no del servidor

Cliente 2:

  • client2.jar: clases utilizadas por el cliente 2 solamente
  • servidor client2-common.jar: clases compartidas por servidor y cliente 2
  • cliente-common.jar: clases compartidas por el cliente 1 y el cliente 2, pero no del servidor

Soy consciente de que puede hacerlo de forma manual utilizando la hormiga, pero sería un desastre mantenimiento. ¿Hay alguna herramienta que se encargue de tal dependencia automáticamente?

+1

Si está utilizando 'experto' para el proceso de construcción, compruebe esta discusión: http://stackoverflow.com/questions/2424015/maven-best-practice- para que generen-multiple-frascos-con-diferente-filtradas-clases – bchetty

Respuesta

1

Una de las mejores prácticas en la construcción de aplicaciones es tener un contenedor por proyecto.
Maven, por ejemplo, usa esto como predeterminado. Puede engañarlo para que haga lo contrario, pero es mejor unirse a ellos en lugar de "luchar" contra ellos.

http://maven.apache.org/guides/mini/guide-using-one-source-directory.html
http://www.sonatype.com/people/2010/01/how-to-create-two-jars-from-one-project-and-why-you-shouldnt/

Así, en su caso, se debe crear 6 proyectos: servidor, CLIENT1 Client2, ServerClient1Common, ServerClient2Common, ClientCommon

el fin de seleccionar las clases necesarias, lo no creo que haya una herramienta, y probablemente debería saber mejor cuál es la funcionalidad común. Cree los proyectos comunes y agréguelos a la ruta de compilación - dependencias. Luego comience a mover sus clases al proyecto Común, dejándolas en el mismo paquete.

Por ejemplo, cree el proyecto ServerClient1Common.
Para el Cliente1, vaya a Configurar ruta de compilación -> Proyectos. Agregar ServerClient1Common. Elimine todas las referencias a Server Project.
Para Servidor, vaya a Configurar ruta de compilación -> Proyectos. Agregar ServerClient1Common. Elimine todas las referencias al Proyecto Client1.

Ahora debería tener muchas clases/importaciones faltantes. Intenta resolverlos uno por uno.

Al final, usted debe poder compilar los 3 proyectos y obtener los frascos que mencionó.

PD: Otras estrategias (como un proyecto uber con diferentes objetivos de compilación, o 3 proyectos con constructores de hormigas y constructores entrelazados) son más complicadas. Quizás haya una excepción, otra forma de dividir las clases, pero no sé si se aplica a usted: client1.jar, client1-interface.jar, client2.jar, client2-interface.jar, server.jar, server- interface.jar.De esta forma, podría usar 3 proyectos, cada uno con dos tarros objetivo. Para ejecutar client2.jar necesitará servidor interface.jar

3

¿Qué quiere decir "desastre de mantenimiento"? Si creas un script ANT, simplemente ejecútalo y compilará y empacará los frascos por ti.

Como una alternativa más robusta, puede usar maven. Para algo más ligero, la herramienta de exportación de eclipse integrada podría funcionar.

+0

por el desastre de mantenimiento, no se necesita para actualizar el guión de hormigas cada vez que se crea una clase o interfaz? –

+1

Probablemente deberías crear al menos tres paquetes separados: 'server',' client' y 'shared' y simplemente agregarlos al script. – Marcelo

+0

Ese es el problema que estoy teniendo - en el mismo paquete, algunas clases se basan en la visibilidad de paquete, algunos son compartidos y otros no deben ser compartidas. –

3

No puedo presentarle una solución lista para usar. He aquí una idea sin embargo: crear una anotación o un conjunto de anotaciones de la siguiente manera:

@jarselector(types='server') 
class ServerOnly { 
    ... 
} 

@jarselector(types='server,client1') 
class ServerAndClient { 
    ... 
} 

A continuación, crear su propia tarea ant mediante la extensión de la tarea tarro (o plugin de Maven) o danos tu tarea, que lleva esta anotación y empaqueta las clases de acuerdo con la anotación, que luego usaría como filtro.

Solo tendrías que crear la tarea una vez; lo he hecho en el pasado, es menos complicado de lo que parece y el problema parece lo suficientemente grande como para justificar el esfuerzo.

Después, debe anotar todas sus clases una vez (o dependiendo de su implementación solo aquellas clases que los clientes necesitan, o solo aquellas que no están compartidas por cada jar, etc.). Quien ve una clase puede ver de inmediato para qué se usa. Al crear una nueva clase, puede agregar fácilmente la anotación.

Realmente no creo que haya una tarea de hormigas listadas o un plugin de maven que haga esto.

Alternativamente, si realmente no puede cambiar la estructura de su paquete, también puede usar múltiples directorios de origen para mantener los paquetes pero dividirlos en directorios diferentes. A Eclipse no le importa cuántos directorios fuente use. Luego, necesitaría adaptar su herramienta de compilación solo una vez para los directorios de origen y luego podría ordenar los archivos de esa manera.

1

Tenga un proyecto de Eclipse por separado para cada JAR que va a crear. Luego configure las dependencias en la pestaña "Proyectos" de la Ruta de compilación, para cada uno de los proyectos de nivel superior. Por lo tanto, el proyecto "servidor" incluirá "servidor-cliente1-común" y "servidor-cliente2-común" como proyectos obligatorios. Y así.

He visto este modelo utilizado por una serie de organizaciones diferentes, y siempre he pensado que esta era la forma de hacerlo "aceptada en la industria". ¡Simplemente funciona!

Cuestiones relacionadas