Como adicionar bibliotecas JAR ao projeto WAR sem enfrentar java.lang.ClassNotFoundException? Classpath vs caminho de compilation vs / WEB-INF / lib

Como devo adicionar bibliotecas JAR a um projeto WAR no Eclipse sem enfrentar java.lang.ClassNotFoundException ou java.lang.NoClassDefFoundError ?

A variável de ambiente CLASSPATH parece não funcionar. Em alguns casos, adicionamos arquivos JAR à propriedade Build Path do projeto Eclipse para compilar o código. Às vezes, precisamos colocar arquivos JAR dentro da pasta /WEB-INF/lib do aplicativo da web Java EE para fazer com que o código seja executado em classs dentro desse JAR.

Eu não entendo exatamente porque CLASSPATH não funciona e em quais casos nós devemos adicionar JARs para Build Path e quando exatamente esses JARs devem ser colocados em /WEB-INF/lib .

A variável de ambiente CLASSPATH é usada apenas pelo comando java.exe e, mesmo assim, somente quando usada sem qualquer argumento -cp , -classpath , -jar . Ele é ignorado por IDEs como Eclipse, Netbeans e IDEA. Veja também java.lang.ClassNotFoundException apesar de usar a variável de ambiente CLASSPATH .

O Caminho de Construção é apenas para bibliotecas que são necessárias para obter o código do projeto para compilar. Colocar manualmente o JAR em /WEB-INF/lib ou configurar o Conjunto de Implementação ou permitir que um sistema de compilation externo, como o Maven, coloque o como JAR em /WEB-INF/lib do WAR produzido durante a compilation, seja apenas para bibliotecas que são necessários para obter o código para implantar e executar no ambiente de destino também. Note que você não deve criar subpastas em /WEB-INF/lib . Os JARs devem ser colocados na raiz.

Algumas bibliotecas já são fornecidas pelo servidor Java EE de destino ou servletcontainer, como JSP, Servlet, EL, etc. Portanto, não é necessário colocar os JARs dessas bibliotecas em /WEB-INF/lib . Além disso, isso só causaria problemas de carregamento de class. É suficiente para (indiretamente) especificá-los apenas no Build Path . No Eclipse, você normalmente faz isso configurando o Runtime Direcionado de acordo. Ele terminará automaticamente no Build Path . Veja também Como importo a API javax.servlet no meu projeto Eclipse?

Outras bibliotecas, geralmente de terceiros, como Apache Commons, drivers JDBC e bibliotecas padrão não fornecidas pelo servletcontainer de destino (por exemplo, Tomcat não suporta JSF, CDI, JPA, EJB, etc.), precisam terminar em /WEB-INF/lib . Você não precisa necessariamente especificá-lo no caminho de compilation . Talvez apenas quando você já o possui como Biblioteca de usuários , mas deve usar a configuração da assembly de implantação para isso. Consulte também ClassNotFoundException ao usar Bibliotecas do Usuário no caminho de construção do Eclipse .

Caso você esteja usando o Maven, é necessário ter certeza absoluta de marcar bibliotecas como provided se elas já forem fornecidas pelo tempo de execução de destino, como Java EE, Servlet, EL, etc. no caso você implanta em WildFly, TomEE, etc. Desta forma, eles não terminarão em /WEB-INF/lib de WAR produzido (e possivelmente causarão conflitos com bibliotecas empacotadas pelo servidor), mas eles acabarão no Caminho de Construção do Eclipse (e obtenha o código do projeto para compilar).

Esses JARs no caminho de construção são referenciados apenas para o processo de compilation (compilation). Se você exportar seu Aplicativo da Web, ele não será incluído no WAR final (experimente).

Se você precisar dos JARs em tempo de execução, deverá colocá-los em WEB-INF / lib ou no caminho de class do servidor. Colocar seus JARs no classpath do servidor só faz sentido se vários WARs compartilharem uma base de código comum e tiverem a necessidade de acessar objects compartilhados (por exemplo, um Singleton).

Se você estiver usando o Maven :

Abra as propriedades do projeto e, em Assembly de Implantação, clique em Adicionar …

Em seguida, selecione Java Build Path Entries e selecione Maven Dependencies

Eu quero dar a resposta para a pergunta do link seguinte ClassNotFoundException oracle.jdbc.driver.OracleDriver apenas no servlet, usando o Eclipse

Ans: No Myeclipse, vá para Servidor -> clique com o botão esquerdo em Myeclipse Tomcat7 -> Configurar Conector de Servidor -> (Expandir) Myeclipse Tomcat7 -> Caminhos -> Prefixo ao caminho de class -> Adicionar flask (adicione oracle14 jar) – -> ok