Solucionado (ver solução)
Solucionado
(ver solução)
8
respostas

Ajuda com dependências atualizadas no Maven

Olá! Tudo bem? Pessoal, gostaria de ajuda com as referências mais atualizadas no maven. Já passei mais de uma semana pesquisando na net, mas cada post é uma versão diferente, que aponta para dependências diferentes, que por sua vez necessitam de versões específicas de outras dependências.

Pergunto aqui porque eu não gostaria de ficar jogando dependências como uma metralhadora de posts diferentes até ver a hora que vai funcionar ( :D ). Quero fazer um código consciente, sabendo pra que serve cada coisa.

Obs: o projeto no qual estou tentando acrescentar o JAX-RS é uma aplicação JSF (javax.faces 2.3.2) com CDI Weld (2.2.9.Final).

Agradeço muito desde já. Valeu! :D

8 respostas

Oi Everton,

Pode postar aqui como está o pom.xml do seu projeto?

Olá Rodrigo! Tudo bem?

Minhas minha dificuldade inicial era fazer funcionar com as dependências atualizadas no maven. Foi uma dor de cabeça pesada até conseguir alguma coisa... kkkkkkk..

As primeiras referências que encontrei indicavam uma configuração no web.xml. Porém, as últimas indicavam apenas uma classe de configuração.

Fui testando várias versões no repositório do maven, subindo da menos atualizada até a mais atualizada, até chegar na mais atualizada que funcionava normalmente.

O problema seguinte foi fazer funcionar a injeção de dependências pelo weld no resource. Depois de algumas semanas de pesquisa (kkkkk), consegui fazer funcionar.

Atualmente, está funcionando. A classe de configuração está descrita abaixo:

import javax.ws.rs.ApplicationPath;

import org.glassfish.jersey.server.ResourceConfig;

@ApplicationPath("webapi") public class RootResource extends ResourceConfig {

public RootResource() {
    packages("resource");
}

}

O resource de teste ficou conforme abaixo:

import javax.enterprise.context.RequestScoped; import javax.inject.Inject; import javax.ws.rs.GET; import javax.ws.rs.Path; import javax.ws.rs.Produces; import javax.ws.rs.core.MediaType; import javax.ws.rs.core.Response; import service.ProdutoService;

@RequestScoped @Path("/produtos") public class ProdutoResource {

@Inject
private ProdutoService produtoService;

@GET
@Produces(MediaType.TEXT_PLAIN)
public Response greet() {
    System.out.println("Acionou o método da API de obtenção de dados do service");
    String descricaoProduto = produtoService.getPorId(1l).getDescricao();
    //return "Hello, World!";
    return Response.status(200).entity(descricaoProduto).build();
}

}

E as dependências necessárias para o funcionamento são essas listadas abaixo:

    <!-- Dependências JAX-RS -->
    <dependency>
        <groupId>org.glassfish.jersey.core</groupId>
        <artifactId>jersey-server</artifactId>
        <version>2.31</version>
    </dependency>
    <dependency>
        <groupId>org.glassfish.jersey.containers</groupId>
        <artifactId>jersey-container-servlet</artifactId>
        <version>2.31</version>
    </dependency>
    <dependency>
        <groupId>org.glassfish.jersey.inject</groupId>
        <artifactId>jersey-hk2</artifactId>
        <version>2.31</version>
    </dependency>

    <dependency>
        <groupId>org.glassfish.jersey.ext.cdi</groupId>
        <artifactId>jersey-cdi1x</artifactId>
        <version>2.31</version>
    </dependency>

    <dependency>
        <groupId>javax</groupId>
        <artifactId>javaee-api</artifactId>
        <version>8.0</version>
        <scope>provided</scope>
    </dependency>

    <!-- API, java.xml.bind module -->
    <dependency>
        <groupId>jakarta.xml.bind</groupId>
        <artifactId>jakarta.xml.bind-api</artifactId>
        <version>2.3.2</version>
    </dependency>

    <!-- Runtime, com.sun.xml.bind module -->
    <dependency>
        <groupId>org.glassfish.jaxb</groupId>
        <artifactId>jaxb-runtime</artifactId>
        <version>2.3.2</version>
    </dependency>

Teve um outro curso que comprei em que o orientador fez funcionar somente com essa dependência:

<dependency>
    <groupId>javax</groupId>
    <artifactId>javaee-api</artifactId>
    <version>8.0</version>
    <scope>provided</scope>
</dependency>

Mas por aqui não funcionou somente com ela, não entendi o motivo.

Desde já, muito obrigado!

Acabei de encontrar o motivo agora de a dependência abaixo não funcionar:

    <dependency>
        <groupId>javax</groupId>
        <artifactId>javaee-api</artifactId>
        <version>8.0</version>
        <scope>provided</scope>
    </dependency>

Ela não funciono porque estou utilizando o tomcat, que é um servlet container. Só funcionaria se eu utilizasse um application server.

Opa Everton,

Ah sim, precisa ser um servidor Java EE mesmo par funcionar sem problemas.

Com Tomcat ou Jetty dá problemas.

Hummm, entendi.

No caso, com as dependências que coloquei acima, está funcionando normal (pelo menos, agora enquanto estou na fase de testes).

Como tenho que utilizar o tomcat, com base nas dependências apresentadas, a quais problemas minha aplicação estará suscetível?

É que no seu caso não faz sentido utilizar o tomcat, pois você precisa utilizar várias especificações do Java EE, como CDI, JAX-RS e talvez JPA e EJB.

Então o recomendado é utilizar um servidor Java EE completo, como WildFly, Glassfish, dentre outros, pois eles já provem a implementação de cada uma dessas especificações.

Até é possível utilizar o Tomcat, mas nem todas as especificações vão funcionar, e além disso vai ter que fazer diversas configurações meio "complicadas" para fazer funcionar normalmente, pois acaba sendo meio que uma "gambiarra" para que alguns recursos do Java EE, como o CDI, funcione no Tomcat.

Eita que interessante. Estou gostando do aprendizado.

Sinceramente, você chamou a atenção para algo que até agora eu não tinha parado para pensar. De fato, faz todo sentido.

Porém, acho que terei uma certa dor de cabeça para fazer a adaptação, pois a aplicação em questão trata-se de um ERP já meio grande, com várias funcionalidades e que foi desenvolvido há uns 5 anos em média.

A stack base que estou utilizando hoje é: JSF CDI JAX-RS JPA (Hibernate como implementação) Primefaces

Obs: não utilizo EJB.

Tenho que estudar isso mais detalhadamente porque, se ao mudar de versão de framework às vezes dá uma certa dor de cabeça, imagina aí mudar de um servlet container para um application server. kkkkkk...

solução!

Legal Rodrigo! Fiz o teste aqui com o WildFly e rodou normalmente a parte do JAX-RS sem eu ter que utilizar aqueles (e várias outras dependências do contexto JEE). Agora vou trabalhar pra adaptar meu ERP pra rodar nele. Muito obrigado! :D