The simplest “micro” deployment (ArqTip #2)

read the asciidoc based version of this post here.

The second Arquillian tip is the simplest “micro” deployment. Its a Arquillian deployment that uses the hole project as deployment with no need for adding individual classes, packages or libraries:



Since ShrinkWrap 3 it is now possible to generate a deployment with everything on classpath using shringwrap api:

    public static Archive<?> createDeployment() {
        WebArchive war = (WebArchive) EmbeddedMaven.forProject(new File("pom.xml"))

        war.addAsResource("persistence.xml", "META-INF/persistence.xml");//replace with test persistence
        return war;


public class SimplestDeployment {

    public static Archive&lt;?&gt; createDeployment() {
        WebArchive war = ShrinkWrap.create(ZipImporter.class, "cdi-crud.war").
                importFrom(new File("target/cdi-crud.war")).as(WebArchive.class);
        war.addAsResource("persistence.xml", "META-INF/persistence.xml");//replace with test persistence
        return war;

    CarService carService;

    public void shouldCountCars() {
        assertEquals(carService.crud().count(), 4);

This basically uses a previously builded project as deployment and just replaces its persistence.xml to use a test database.

Compare it with a traditional deployment here.

Of course that this simplicity comes with a price:

1 – Its not a true micro deployment because it uses the hole application. If your application is big the deployment can take considerable time(seconds);

2 – You need to build the application before running the test. Here you lose a big advantage of Arquillian which is to not build the application if a test (even functional tests) has failed.

To overcome problem #2 you can execute the tests in surefire integration-tests phase:



There is an issue from 2012 in Arquillian issue tracker which address this feature of a “simplest deployment”  using a single annotation , see the issue here:

Source code of this post can be found here:



Acessando informações de um projeto maven

Neste post vou mostrar como podemos acessar informações de um projeto maven a partir do arquivo pom.xml e exibir estas informações em uma aplicação web.

iremos utilizar como exemplo o seguinte pom.xml:

<project xmlns=”; xmlns:xsi=”;




Para conseguirmos acessar as propriedades (declaradas dentro da tag properties) do pom.xml devemos informar a localização do diretório resources da nossa applicação atravéz da tag <resources> e além disto devemos criar um arquivo .properties neste diretório(src/main/resources), e informar  a entrada abaixo: = ${}

este arquivo será o elo entre nossa aplicação e o arquivo pom.xml, é o famoso arquivo de bundle utilizado para internacionalização.

Com as configurações acima agora somos capazes de acessar as propriedades do arquivo pom, segue o código do bean que irá acessar as propriedades e guarda-las em um mapa:

 * @author rmpestano
public class ApplicationInfoMBean implements Serializable{

   private Map<String,String> infoMap = new HashMap<String, String>();
   private ResourceBundle resourceBundle;

   public void initialize(){

     String appProperties = resourceBundle.getString("");
     appProperties = appProperties.substring(1, appProperties.indexOf("}"));
     String[] arrayProperties = appProperties.split("[\\s,]+");//separa cada propriedade por vírgula ignorando espaços
     for (String prop : arrayProperties) {
       String[] keyValue = prop.split("=");  
       infoMap.put(keyValue[0], keyValue[1]);//coloca nome da propripriedade na chave e a versão no valor do mapa
  public Map<String, String> getInfoMap() {
   return infoMap;
  public void setInfoMap(Map<String, String> infoMap) {
   this.infoMap = infoMap;


seguem imagens mostrando como as propriedades do pom.xml chegam no bean


Após popularmos o mapa de propriedades nós acessamos esse mapa na tela passando o nome da propriedade como chave e o mapa nos retorna a versão como valor, segue o código da pagina .xhtml

Mojarra #{applicationInfoMBean.infoMap['mojarra.version']}, Primefaces #{applicationInfoMBean.infoMap['primefaces.version']},....e por aí vai

Agora quando atualizarmos as dependencias do projeto não precisamos mais alterar a tela que exibe essas informações.