Comment créer des fichiers de guerre

96

Quelles sont les meilleures pratiques pour créer des fichiers war (en utilisant eclipse) à exécuter sur tomcat? les tutoriels, liens, exemples sont très appréciés.


la source

Réponses:

98

Vous pouvez utiliser Ant pour configurer, compiler, WAR et déployer votre solution.

<target name="default" depends="setup,compile,buildwar,deploy"></target>

Vous pouvez ensuite exécuter un clic dans Eclipse pour exécuter cette cible Ant. Voici des exemples de chacune des étapes:

Conditions préalables

Nous supposerons que votre code est organisé comme suit:

  • ${basedir}/src: Fichiers Java, propriétés, fichiers de configuration XML
  • ${basedir}/web: Vos fichiers JSP
  • ${basedir}/web/lib: Tous les fichiers JAR requis au moment de l'exécution
  • ${basedir}/web/META-INF: Votre manifeste
  • ${basedir}/web/WEB-INF: Vos fichiers web.xml

Installer

Définissez une setuptâche qui crée le répertoire de distribution et copie tous les artefacts qui doivent être WARred directement:

<target name="setup">
    <mkdir dir="dist" />
    <echo>Copying web into dist</echo>
    <copydir dest="dist/web" src="web" />
    <copydir dest="dist/web/WEB-INF/lib" src="${basedir}/../web/WEB-INF/lib" />
</target>

Compiler

Construisez vos fichiers Java en classes et copiez sur tous les artefacts non-Java qui résident sous srcmais doivent être disponibles au moment de l'exécution (par exemple, propriétés, fichiers XML, etc.):

<target name="compile">
    <delete dir="${dist.dir}/web/WEB-INF/classes" />
    <mkdir dir="${dist.dir}/web/WEB-INF/classes" />
    <javac destdir="${dist.dir}/web/WEB-INF/classes" srcdir="src">
        <classpath>
            <fileset dir="${basedir}/../web/WEB-INF/lib">
                  <include name="*" />
            </fileset>
        </classpath>
    </javac>
    <copy todir="${dist.dir}/web/WEB-INF/classes">
        <fileset dir="src">
            <include name="**/*.properties" />
            <include name="**/*.xml" />
        </fileset>
    </copy>
</target>

Construire WAR

Créez le WAR lui-même:

<target name="buildwar">
    <war basedir="${basedir}/dist/web" destfile="My.war"
     webxml="${basedir}/dist/web/WEB-INF/web.xml">
        <exclude name="WEB-INF/**" />
        <webinf dir="${basedir}/dist/web/WEB-INF/">
            <include name="**/*.jar" />
        </webinf>
    </war>
</target>

Déployer

Enfin, vous pouvez configurer une tâche pour déployer le WAR directement dans votre emplacement de déploiement Tomcat:

<target name="deploy">
    <copy file="My.war" todir="${tomcat.deploydir}" />
</target>

Cliquez et c'est parti!

Une fois tout cela configuré, il vous suffit de lancer la defaultcible depuis Eclipse pour compiler, WAR et déployer votre solution.

L'avantage de cette approche est qu'elle fonctionnera aussi bien en dehors d'Eclipse qu'au sein d'Eclipse et peut être utilisée pour partager facilement votre stratégie de déploiement (par exemple via le contrôle de code source) avec d'autres développeurs qui travaillent également sur votre projet.

David Citron
la source
eh bien, je veux le déployer sur tomcat. Comment changer le targer?
Pourriez-vous s'il vous plaît élaborer? Tant que $ {tomcat.deploydir} pointe vers votre répertoire de déploiement de contexte Tomcat, cela devrait le faire. Non?
David Citron
1
Dans la cible de guerre, il n'y a pas de '<exclude name = "WEB-INF / **" />'. Vous avez généré des fichiers * .class dans ce dossier et leur exclusion ne fonctionne pas. Supprimez cette ligne d'exclusion de la cible de guerre qu'elle fonctionne.
ankitjaininfo
2
Cette réponse est inutilement compliquée.
Alex R
38

J'ai toujours juste sélectionné Exporter depuis Eclipse. Il construit le fichier war et inclut tous les fichiers nécessaires. Fournir que vous avez créé le projet en tant que projet Web, c'est tout ce que vous aurez à faire. Eclipse le rend très simple à faire.

Logiciel Mech
la source
Merci! et pour ce que ça vaut, vous sélectionnez "Exporter" dans le menu "Fichier", puis dans "Sélectionnez une destination d'exportation" tapez "WAR" et l'option de fichier de guerre apparaîtra.
Brad Parks
4
mon choix pour les applications Web rapides et sales. écrire un script de fourmi juste pour sortir un WAR de test est trop de travail.
Renan
une autre solution au lieu de créer un fichier ant serait d'aller dans le dossier que vous voulez envelopper dans le fichier WAR et d'exécuter cette commande "jar -cvf name.war *".
MC
Merci pour cela, BEAUCOUP plus simple que de configurer Maven ou Ant (quand ce n'est pas forcément nécessaire).
simon
23

Nous utilisons Maven (le grand frère d'Ant) pour tous nos projets java, et il a un plugin WAR très astucieux. Vous y trouverez des didacticiels et des utilisations.

C'est beaucoup plus facile que Ant, entièrement compatible avec Eclipse (utilisez maven eclipse: eclipse pour créer des projets Eclipse) et facile à configurer.

Page d'accueil de Maven

Plug-in Maven WAR

Exemple de configuration:

<plugin>
    <groupId>org.apache.maven.plugins</groupId>
    <artifactId>maven-war-plugin</artifactId>
    <version>2.1-alpha-2</version>
    <configuration>
        <outputDirectory>${project.build.directory}/tmp/</outputDirectory>
        <workDirectory>${project.build.directory}/tmp/war/work</workDirectory>
        <webappDirectory>${project.build.webappDirectory}</webappDirectory>
        <cacheFile>${project.build.directory}/tmp/war/work/webapp-cache.xml</cacheFile>
        <nonFilteredFileExtensions>
            <nonFilteredFileExtension>pdf</nonFilteredFileExtension>
            <nonFilteredFileExtension>png</nonFilteredFileExtension>
            <nonFilteredFileExtension>gif</nonFilteredFileExtension>
            <nonFilteredFileExtension>jsp</nonFilteredFileExtension>
        </nonFilteredFileExtensions>
        <webResources>
            <resource>
                <directory>src/main/webapp/</directory>
                <targetPath>WEB-INF</targetPath>
                <filtering>true</filtering>
                <includes>
                    <include>**/*.xml</include>
                </includes>
            </resource>
        </webResources>
        <warName>Application</warName>
    </configuration>
</plugin>
Mikek
la source
1
Je vous ai rendu votre point (même si ce n'est pas moi qui l'ai enlevé). Maven est certainement un choix raisonnable si vous (voulez?) Vous adapter à leur version particulière de la "convention sur la configuration".
David Citron
1
Il se trouve que je l'aime =) Je travaille en tant que CM sur un assez gros projet, et j'apprécie que le travail de configuration de projet soit fait pour moi. De plus, le support du plugin est merveilleux. Être capable d'avoir un projet multi-module opérationnel avec un plugin WAR, avec Surefire et CheckStyle en cinq minutes est un régal. Ant, bien que plus ouverte et sans doute plus puissante, est un problème en comparaison. Quoi qu'il en soit, Maven est un sous-ensemble de Ant, donc si vous avez besoin de faire des scripts là-bas, vous êtes les bienvenus.
mikek le
4
Outre la structure XML de Maven basée sur ANT, et ANT étant incorporé en tant que sous-ensemble de Maven.
mikek
14

Un fichier war est simplement un fichier jar avec une extension war, mais ce qui le fait fonctionner, c'est la manière dont le contenu est réellement structuré.

Le tutoriel J2EE / Java EE peut être un début:

http://java.sun.com/j2ee/tutorial/1_3-fcs/doc/WebComponents3.html

Et la spécification Servlet contient les détails sanglants:

http://java.sun.com/products/servlet/download.html

Si vous créez un nouveau projet Web dans Eclipse (je fais référence à la version Java EE), la structure est créée pour vous et vous pouvez également lui indiquer où votre serveur d'applications est installé et il déploiera et démarrera l'application pour vous.

L'utilisation de l'option "Exporter-> Fichier WAR" vous permettra de sauvegarder le fichier war.

boxofrats
la source
12

Si vous ne savez pas quoi faire et que vous partez de zéro, Maven peut vous aider à démarrer.

En suivant les étapes ci-dessous, vous pouvez obtenir une nouvelle configuration de projet de guerre parfaitement dans eclipse.

  1. Téléchargez et installez Maven
  2. Exécutez la ligne de commande: mvn archetype:generate
  3. Suivez les étapes demandées - en choisissant le projet Web Java simple (18) et un nom approprié.
  4. Quand il est terminé, exécutez: mvn eclipse:eclipse
  5. Démarrez Eclipse. Choisissez Fichier -> Importer -> Projet existant. Sélectionnez le répertoire dans lequel vous avez exécuté les objectifs mvn.
  6. Ca y est vous devriez maintenant avoir un très bon départ pour un projet de guerre en éclipse
  7. Vous pouvez créer la guerre elle-même en l'exécutant mvn packageou en la déployant en configurant un serveur dans eclipse et en ajoutant simplement l'ajout du projet au serveur.

Comme certains l'ont dit, l'inconvénient de l'utilisation de maven est que vous devez utiliser les conventions maven. Mais je pense que si vous débutez, apprendre les conventions est une bonne idée avant de commencer à créer les vôtres. Rien ne vous empêche de changer / refactoriser ultérieurement votre méthode préférée.

J'espère que cela t'aides.

Pablojim
la source
3

Utiliser le code de construction de fourmi J'utilise ceci pour mon projet SMS

<property name="WEB-INF" value="${basedir}/WebRoot/WEB-INF" />
<property name="OUT" value="${basedir}/out" />
<property name="WAR_FILE_NAME" value="mywebapplication.war" />
<property name="TEMP" value="${basedir}/temp" />

<target name="help">
    <echo>
        --------------------------------------------------
        compile - Compile
        archive - Generate WAR file
        --------------------------------------------------
    </echo>
</target>

<target name="init">
    <delete dir="${WEB-INF}/classes" />
    <mkdir dir="${WEB-INF}/classes" />
</target>

<target name="compile" depends="init">
    <javac srcdir="${basedir}/src" 
                destdir="${WEB-INF}/classes" 
                classpathref="libs">
    </javac>
</target>

<target name="archive" depends="compile">
    <delete dir="${OUT}" />
    <mkdir dir="${OUT}" />
    <delete dir="${TEMP}" />
    <mkdir dir="${TEMP}" />
    <copy todir="${TEMP}" >
        <fileset dir="${basedir}/WebRoot">
        </fileset>
    </copy>
    <move file="${TEMP}/log4j.properties" 
                    todir="${TEMP}/WEB-INF/classes" />
    <war destfile="${OUT}/${WAR_FILE_NAME}" 
                    basedir="${TEMP}" 
                    compress="true" 
                    webxml="${TEMP}/WEB-INF/web.xml" />
    <delete dir="${TEMP}" />
</target>

<path id="libs">
    <fileset includes="*.jar" dir="${WEB-INF}/lib" />
</path>

SMS
la source
2

Une autre option serait de le construire automatiquement en utilisant Eclipse. Bien sûr, si vous disposez d'un environnement d'intégration continue, Ant ou Maven est recommandé. L'alternative d'exportation n'est pas très pratique car vous devez configurer à chaque fois les propriétés d'exportation.

PAS:

  1. Activer la prise en charge des "Archives de projet"; cela peut dépendre de votre projet (je l'ai utilisé sur un projet Java EE / Web). Cliquez avec le bouton droit sur le répertoire racine du projet; Configurer -> Ajouter la prise en charge des archives de projet.

  2. Allez créer une nouvelle archive dans le répertoire supérieur "Project Archives". Vous n'avez que l'option jar, mais vous nommez archive * .war.

  3. Configurez les ensembles de fichiers, c'est-à-dire les fichiers à inclure. Il est courant de configurer deux ensembles de fichiers de la même manière que l'assembly de déploiement Web (propriété du projet) est configuré.

    • copier / WebContent vers /
    • copier / build / classes dans WEB-INF / classes (créez cet ensemble de fichiers après avoir défini le répertoire WEB-INF / classes dans l'archive)
  4. Vous devrez peut-être modifier la propriété d'exclusion de l'ensemble de fichiers en fonction de l'endroit où vous avez placé certains des fichiers de configuration ou vous pourriez avoir besoin de plus d'ensembles de fichiers, mais l'idée est qu'une fois que vous avez configuré cela, vous n'avez pas besoin de le changer.

  5. Créer l'archive manuellement ou publier directement sur le serveur; mais est également automatiquement construit pour vous par Eclipse

arpadf
la source
2

Utilisez la commande suivante en dehors du dossier WEB-INF. Cela devrait créer votre fichier de guerre et c'est la méthode la plus rapide que je connaisse.

(Vous aurez besoin du JDK 1.7+ installé et des variables d'environnement qui pointent vers le répertoire bin de votre JDK.)

jar -cvf projectname.war *

Lien de référence

XChikuX
la source
0

Solution plus simple qui actualise également l'espace de travail Eclipse:

<?xml version="1.0" encoding="UTF-8"?>
<project name="project" default="default">    
    <target name="default">
        <war destfile="target/MyApplication.war" webxml="web/WEB-INF/web.xml">
            <fileset dir="src/main/java" />
            <fileset dir="web/WEB-INF/views" />
            <lib dir="web/WEB-INF/lib"/>
            <classes dir="target/classes" />
        </war>
        <eclipse.refreshLocal resource="MyApplication/target" depth="infinite"/>
    </target>
</project>
Alex R
la source
0

Code Shell simpliste pour créer des fichiers WAR à partir d'un projet Web dynamique Eclipse standard. Utilise le système de fichiers RAM (/ dev / shm) sur une plate-forme Linux.

#!/bin/sh

UTILITY=$(basename $0)

if [ -z "$1" ] ; then
    echo "usage: $UTILITY [-s] <web-app-directory>..."
    echo "       -s ..... With source"
    exit 1
fi

if [ "$1" == "-s" ] ; then
    WITH_SOURCE=1
    shift
fi

while [ ! -z "$1" ] ; do
    WEB_APP_DIR=$1

    shift

    if [ ! -d $WEB_APP_DIR ] ; then
        echo "\"$WEB_APP_DIR\" is not a directory"
        continue
    fi

    if [ ! -d $WEB_APP_DIR/WebContent ] ; then
        echo "\"$WEB_APP_DIR\" is not a Web Application directory"
        continue
    fi

    TMP_DIR=/dev/shm/${WEB_APP_DIR}.$$.tmp
    WAR_FILE=/dev/shm/${WEB_APP_DIR}.war

    mkdir $TMP_DIR

    pushd $WEB_APP_DIR > /dev/null
    cp -r WebContent/* $TMP_DIR
    cp -r build/* $TMP_DIR/WEB-INF
    [ ! -z "$WITH_SOURCE" ] && cp -r src/* $TMP_DIR/WEB-INF/classes
    cd $TMP_DIR > /dev/null
    [ -e $WAR_FILE ] && rm -f $WAR_FILE
    jar cf $WAR_FILE .
    ls -lsF $WAR_FILE
    popd > /dev/null

    rm -rf $TMP_DIR
done
Joe Horvath
la source
-3

** Création d'un fichier War dans le projet Web Eclips Gaynemed of grails **

1. projet d'importation:

2.Modifiez le fichier datasource.groovy

Comme ceci: url = "jdbc: postgresql: //18.247.120.101: 8432 / PGMS"

2.chnge AppConfig.xml

3. tuez le Java à partir du gestionnaire de tâches:

  1. exécuter la commande propre dans les éclipses

  2. lancez 'prod war' suivi du nom du projet.

  3. Vérifiez le fichier journal et recherchez le même fichier .war dans le répertoire de Workbench avec la même date.

Ratnesh Kumar
la source