mardi 27 novembre 2012

Forcer maven à vérifier qu'une version release n'a pas été modifiée

Maven repose sur un principe pour la production des artefacts (war, jar, ear...).
Il existe des versions en cours de développement (SNAPSHOT) et des versions définitives (release).

Les versions en cours de développement, par définition, change régulièrement avec le même numéro de vesion (1.2.0-SNAPSHOT).
Il se peut qu'il y en ait plusieurs par jour de produites.

Les versions release, elles au contraire sont livrées qu'une seule fois. Si elles doivent être relivrées, c'est qu'il y a une correction faite donc, le principe de versioning fait que le numéro de version va changer.

De ce fait, lorsque maven s'exécute, il vérifie dans son repository local si la dépendance existe.
Si c'est un version SNAPSHOT, elle va vériffier si une nouvelle version a été produite.
Si c'est le cas, maven la télécharge.

Si la dépendance est une version release et que cette version n'est pas dans le repository local, elle sera téléchargée.
Toutefois, si la version est déjà dans le repository local, maven ne va pas vérifier qu'elle a changer.

Dans les fait, il arrive régulièrement, pour diverses raisons, de devoir reproduire une version release.
Alors comment faire pour que maven retélécharge la dépendance ?

Si on se fit à la documentation, en option de lancement, maven dispose de :
 -U,--update-snapshots             Forces a check for updated releases and
                                   snapshots on remote repositories
En réalité, ça ne fonctionne que pour les versions snapshot (testé sur maven 2.1, 2.2 et 3.0.3).

La seule solution est de purger manuellement le repository local, soit par une commande shell, soit par le goal purge-local-repository de maven-dependency-plugin.

mardi 13 novembre 2012

Décompresser un fichier Zip

Je souhaitais, via un programme ou code java décompresser un fichier Zip.
J'ai donc dans un premier temps cherché du côté de l'api standard Java (http://docs.oracle.com/javase/6/docs/api/java/util/zip/package-summary.html).
Le problème, c'est qu'il n'y a rien d'automatique.

Heureusement pour moi, MkYong (http://www.mkyong.com) s'est déjà penché sur la question.
Si vous ne connaissez pas ce site, je vous le conseil, régulièrement ses publications sont forts utiles.

J'ai apporté le support des répertoires dans le zip pour les créer autmatiquement et corrigé une erreur.
/**
 * 
 */
package org.util.zip ;

import java.io.File;
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.IOException;
import java.util.zip.ZipEntry;
import java.util.zip.ZipInputStream;

/**
 * @author MkYong & MARTINEAU Emeric
 * http://www.mkyong.com/java/how-to-decompress-files-from-a-zip-file/
 * 
 */
public class UnZip {
 /**
  * Unzip it
  * 
  * @param zipFile
  *            input zip file
  * @param output
  *            zip file output folder
  */
 public void unZipIt(String zipFile, String outputFolder) {
  try {

   // create output directory is not exists
   File folder = new File(outputFolder) ;
   
   if (!folder.exists()) {
    folder.mkdir() ;
   }

   // get the zip file content
   ZipInputStream zis = new ZipInputStream(
     new FileInputStream(zipFile)) ;
   // get the zipped file list entry
   ZipEntry ze = zis.getNextEntry() ;

   String fileName ;
   
   while (ze != null) {
    fileName = ze.getName() ;
    
    if (ze.isDirectory()) {
     System.out.println("Creating directory : ".concat(fileName)) ;
     
     new File(outputFolder + File.separator + fileName).mkdirs() ;
    } else {
     extractFile(outputFolder, zis, fileName) ;
    }

    zis.closeEntry();
    ze = zis.getNextEntry() ; 
   }

   zis.close();

   System.out.println("Done");

  } catch (IOException ex) {
   ex.printStackTrace();
  }
 }
 
 private void extractFile(final String outputFolder, final ZipInputStream zis, 
   final String fileName) throws IOException {
  final byte[] buffer = new byte[1024] ;
  
  final File newFile = new File(outputFolder + File.separator
    + fileName);

  System.out.println("file unzip : " + newFile.getAbsoluteFile());

  // create all non exists folders
  // else you will hit FileNotFoundException for compressed folder
  new File(newFile.getParent()).mkdirs();

  final FileOutputStream fos = new FileOutputStream(newFile);

  int len;
  
  while ((len = zis.read(buffer)) > 0) {
   fos.write(buffer, 0, len);
  }

  fos.close();
   
 }
}
Un problème étrange toutefois se produit. Si vous créer un fichier zip avec 7Zip il arrive qu'il y ai un problème de CRC

Un autre exemple de qualité : http://www.java-forums.org/blogs/java-io/973-how-work-zip-files-java.html

vendredi 2 novembre 2012

Vider les caches Oracle

Depuis Oracle 10g, pour vider la zone Buffer Cache de la SGA :
alter system flush buffer_cache;
Pour vider le Shared Pool :
alter system flush shared_pool;
Rappels :

  • Shared Pool : zone mémoire Oracle qui stocke les plans d'exécutions, le dictionnaire de données et les structures de contrôle
  • Buffer Cache : zone mémoire Oracle qui stocke blocks de données utilisateurs (c-a-d cache disque)
Merci à Drazzib pour l'astuce.