IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Développement Web en Java Discussion :

Scanner les ressources des JAR dans un WAR


Sujet :

Développement Web en Java

  1. #1
    Membre habitué
    Homme Profil pro
    Architecte senior Java EE/Spring - ScrumMaster
    Inscrit en
    Juin 2010
    Messages
    229
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 50
    Localisation : France

    Informations professionnelles :
    Activité : Architecte senior Java EE/Spring - ScrumMaster
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Juin 2010
    Messages : 229
    Points : 162
    Points
    162
    Par défaut Scanner les ressources des JAR dans un WAR
    Bonjour,

    Je souhaite cataloguer certaines ressources disponibles dans les JARs inclus dans une webapp. Pour cela, j'envisage d'ajouter aux ressources de mes JAR concernés un fichier métier décrivant les informations qui m'intéressent ; ce fichier aurait toujours le même nom et le même emplacement dans chaque JAR.

    Je me demande donc si :
    • On peut effectuer ce scan depuis l’extérieur (sous forme de monitoring par exemple) ; obtenir la liste des JAR puis en analyser le contenu
    • On peut créer un web service SOAP qui effectuerait ce scan "de l'intérieur" pour en livrer une synthèse (listage et analyse itou)


    NB : nous sommes sous jBoss.
    Merci d'avance.

  2. #2
    Membre habitué
    Homme Profil pro
    Architecte senior Java EE/Spring - ScrumMaster
    Inscrit en
    Juin 2010
    Messages
    229
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 50
    Localisation : France

    Informations professionnelles :
    Activité : Architecte senior Java EE/Spring - ScrumMaster
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Juin 2010
    Messages : 229
    Points : 162
    Points
    162
    Par défaut
    Encore une précision : il m'est possible, éventuellement, d'envisager un scan des classes sur la base d'annotations personnalisées existantes qui pourraient être rendues "runtime" ; mais je préférerais que le travail se fasse au build.

    Bonne journée.

  3. #3
    Membre chevronné
    Avatar de fxrobin
    Homme Profil pro
    Architecte SI, Java Fan, API Manager
    Inscrit en
    Novembre 2007
    Messages
    875
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Ille et Vilaine (Bretagne)

    Informations professionnelles :
    Activité : Architecte SI, Java Fan, API Manager
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Novembre 2007
    Messages : 875
    Points : 2 112
    Points
    2 112
    Par défaut
    un JAR est un simple ZIP, donc avec l'API ZIP tu peux analyser le contenu d'un JAR :

    http://cyberzoide.developpez.com/java/zip/

    enfin, pour trouver tous les jar de ton appli, s'ils sont dans /WEB-INF/lib par exemple, il suffit d'utiliser la classe File qui permet de parcourir le répertoire

  4. #4
    Membre habitué
    Homme Profil pro
    Architecte senior Java EE/Spring - ScrumMaster
    Inscrit en
    Juin 2010
    Messages
    229
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 50
    Localisation : France

    Informations professionnelles :
    Activité : Architecte senior Java EE/Spring - ScrumMaster
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Juin 2010
    Messages : 229
    Points : 162
    Points
    162
    Par défaut
    Merci pour la piste ; j'ai fait ça, finalement :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    /**
     * Extraire les librairies incluses dans la webapp (ServletContext) courante
     * @return WEB-INF/lib/*.jar ; les fichiers sont triés par nom
     */
    private Set<JarFile> getJarLibs() {
    	if (this.context == null) {
    		throw new ...Exception("Impossible de déterminer le quartier courant (vérifier web.xml).");
    	}
    	ServletContext servletContext = (ServletContext) this.context.getMessageContext().get(MessageContext.SERVLET_CONTEXT);
     
    	try {
    		Set<JarFile> libs = new TreeSet<JarFile>(new Comparator<JarFile>() {
    			public int compare(JarFile o1, JarFile o2) {
    				return o1.getName().compareToIgnoreCase(o2.getName());
    			}
    		});
    		for (Object jar : servletContext.getResourcePaths("/WEB-INF/lib/")) {
    			URL url = servletContext.getResource((String) jar);
    			assert url.getPath().toLowerCase().endsWith(".jar") : "Fichier non JAR dans WEB-INF/lib : " + url;
    			JarURLConnection conn = (JarURLConnection) url.openConnection();
    			libs.add(conn.getJarFile());
    		}
    		return libs;
     
    	} catch (MalformedURLException e) {
    		throw new ...Exception("Impossible de localiser une librairie.", e);
    	} catch (IOException e) {
    		throw new ...Exception("Impossible de charger une librairie.", e);
    	}
    }
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    List<ServiceDTO> result = new LinkedList<ServiceDTO>();
    for (JarFile lib : this.getJarLibs()) {
    	// trouver une config Spring
    	JarEntry springConfig = (JarEntry) lib.getEntry(SPRING_APPLICATION_CONTEXT_FILENAME);
    	if (springConfig == null)	continue;
     
    	logger.info("Scanning jar " + lib.getName() + "...");
    	// extraire le numéro de version du JAR
    	final String version = this.getVersion(lib);
     
    	this.getInfosFromAnnotations(version, lib, result);
    }
    ...
    /**
     * @return MANIFEST/Implementation-Version (Maven jar plugin)
     */
    private String getVersion(JarFile lib) {
    	try {
    		//DEBUG vérifier la collecte... sinon #getAttributes
    		return lib.getManifest().getMainAttributes().getValue("Implementation-Version");
     
    	} catch (IOException e) {
    		...
    	}
    }
     
    protected void getInfosFromAnnotations(final String version, JarFile lib, List<ServiceDTO> result) {
    	// extraire les classes du JAR
    	Enumeration<JarEntry> jarEntries = lib.entries();
    	while (jarEntries.hasMoreElements()) {
    		JarEntry jarEntry = jarEntries.nextElement();
    		try {
    			Class<?> candidate = Class.forName(jarEntry.getName());
     
    			ServiceConfig serviceConfig = candidate.getAnnotation(ServiceConfig.class);
    			if (serviceConfig != null) {
    				ServiceDTO _serviceDTO = new ServiceDTO(serviceConfig.classifier(), serviceConfig.alias(), version, null);
    				result.add(_serviceDTO);
    			}
     
    		} catch (ClassNotFoundException _e) {
    			...
    		} catch (MalformedURLException _e) {
    			...
    		}
    	}
    }

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. Inclure les classes d'un jar dans un war
    Par Krishtov dans le forum Maven
    Réponses: 7
    Dernier message: 09/02/2012, 16h19
  2. Organisation des jar dans les applis
    Par -=Spoon=- dans le forum JOnAS
    Réponses: 2
    Dernier message: 06/10/2009, 17h19
  3. Organisation des jar dans les applis
    Par -=Spoon=- dans le forum Général Java
    Réponses: 2
    Dernier message: 24/09/2009, 20h37
  4. Build path et export des jar dans un war
    Par sir_gcc dans le forum Eclipse Java
    Réponses: 2
    Dernier message: 05/10/2008, 13h55
  5. ajouter des .jar dans les fichiers de config
    Par C_C dans le forum NetBeans
    Réponses: 5
    Dernier message: 17/11/2006, 16h20

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo