2012-01-22 6 views
7

Así que tengo una aplicación web mvc de primavera que construí en IntelliJ 9, usando Maven.¿Cómo empacar mis clases en un .jar, y aun paquete como una guerra?

Cuando corro una:

mvn clean install 

Se empaqueta todo lo que hasta tanto en un archivo .war y una guerra explotó.

El diseño de mi proyecto utiliza un tipo de arco de aplicación web maven simple.

How can I have my classes compiled into a .jar file also? 

Actualmente mis clases son en:

/target/myapp/WEB-INF/classes/ 

Lo que quiero es que para compilar el código en .jar como:

myapp-1.0.jar 

Y que tiene esto en mi carpeta de /target/myapp/WEB-INF/lib como todos mis otros frascos.

actualización

Quiero que esto hace a través de experto, no IntelliJ específica.

+0

Entonces, ¿cuál es el problema de tener las clases del proyecto en WEB-INF/classes como un contenedor en WEB-INF/lib? – khmarbaise

+0

Por un lado, algunos ingenieros (de pruebas) a menudo se olvidan de actualizar las clases cuando les dices que actualicen su aplicación web instalada con el nuevo código (para mantener la configuración). Es más fácil tener todos los códigos en el directorio lib. – AndrewBourgeois

+0

@Blankman Leí sus preguntas sobre SO sobre ofuscación de la aplicación web. ¿Puede proporcionar el proceso que siguió o algunos archivos de configuración? Puedo generar un jarro ofuscado y una guerra (sin ofuscación). Pero quiero generar una guerra con obf. jar en ella. – phoenix

Respuesta

2

Puede crear fácilmente dos artefactos: un JAR y un WAR.

No estoy seguro de la ventaja de tener sus archivos .class en un JAR en lugar de WEB-INF/classes. Ambos están comprimidos; el JAR no proporcionará una compresión adicional. Es posible que desee volver a utilizar esos archivos .class en otras aplicaciones. si ese es el caso, podría considerar mover esas clases de Java a un módulo separado y agregar el archivo JAR que crea igual que lo haría con cualquier otro JAR de terceros en su archivo WAR. Otras aplicaciones podrían fácilmente verificar el archivo JAR de su repositorio y simplemente reutilizarlo. Esta disposición se realiza mejor moviendo las clases de Java compartidas a un repositorio separado en su sistema de control de versiones.

+1

lo hago porque ejecutar Proguard lo requiere al parecer. – Blankman

+0

Bueno, quiero hacer esto usando maven, entonces puedo construir sin inteligencia. – Blankman

+0

Como dijo duffymo, la creación de dos artefactos de Maven es el camino a seguir: un artefacto de jar, que contiene las clases, y un artefacto de guerra, con una dependencia del artefacto de jar. Tenga en cuenta que las dependencias de sus clases deben trasladarse desde el pom.xml del proyecto de guerra al proyecto jar. –

-2

El tipo de envase es especificado por la etiqueta "envasado" en el pom.xml (por lo general bastante colocado en la parte superior del archivo, junto con la Identificación del artefacto, etc versión del proyecto.

intentar localizar

<packaging>war</packaging> 

en el pom.xml y el cambio a

<packaging>jar</packaging> 
-2

bien escribir un comando java en su consola

jar cvf myapp-1.0.jar * .class

+1

¿Has oído hablar de Maven? Lee la pregunta con cuidado! – panagdu

0

No tengo claro qué beneficio podría haber para tener el contenido de WAR empaquetado como un JAR. El código que implementa la aplicación web no funcionará sin el contexto en el que se implementa una GUERRA.

Dicho esto, es completamente práctico pensar en términos de extraer el núcleo funcional de su código en un módulo Maven separado que tenga un empaque JAR y una agradable API Java. Entonces se puede hacer que su módulo WAR dependa de eso, y solo necesita contener exactamente el código para convertir esa API de Java en una API basada en web.Esto tiene la ventaja de que también mejorará en gran medida la capacidad de su código para ser probado (las pruebas contra el JAR serán definitivamente más fáciles) y le permitirá pensar en términos de tener otros clientes con el mismo código subyacente. Eso podría o no interesarle. ¿Necesitaría algún código de Java directamente en WAR? Tal vez tal vez no. Hay varias maneras de hacerlo, después de todo ...

+0

Hacer un JAR y un WAR del módulo _same_ Maven es simplemente una mala idea. No lo hagas Piense en una separación más clara de responsabilidades. –

0

La solución más sencilla es en la configuración para la guerra-plugin:

<attachClasses>true</attachClasses> 

que hacer el trabajo y crear un archivo jar por separado. Este jar tiene un clasificador de "clases" que se puede cambiar dando a la configuración. Esto puede ser útil si ha separado las pruebas de integración que se basan en la clasificación del proyecto de guerra para publicarlas y ponerlas a disposición como dependencias. Esto no tiene nada que ver con la separación de responsabilidades.

+0

Si realmente desea tener un jar separado y crear un archivo war separado que contenga el jar (WEB-INF/lib), debe crear proyectos separados uno con el jar y el otro con el war code que tiene una dependencia con el jar . – khmarbaise

0

Runninng

mvn jar:jar install 

hará frasco como si ha configurado el tipo de envase al frasco. Sin ningún cambio en tu pom.

Así que todo lo que necesita es ejecutar esa línea por separado, agregarla a la secuencia de comandos o agregar el objetivo jar:jar a su construcción maven existente.

Cuestiones relacionadas