2017-05-24 50 views
0

我有一個EAR,它目前只包含一個WAR。我的問題是,如果mybatis -.... jar文件位於web-module.war \ WEB-INF \ lib然後一切工作正常。但如果我用maven創建了一場小型戰爭,並且兩個mybatis相關的jar文件位於EAR/lib下,我得到一個「沒有正確配置SqlSessionFactory生產者。」「錯誤。EAR情況下MyBatis CDI類加載器問題

我認爲這是一個類路徑相關的問題。

我打算在EAR中加入更多的WAR,並且我想避免將這兩個罐放入每個WAR中。

環境:Java的8,似鯖水狼牙魚服務器4.1.2.172

這是我的耳朵的結構,但它不工作

EAR 
    +-- lib 
     + mybatis-3.4.4.jar 
     + mybatis-cdi-1.0.0.jar 

    +-- web-module.war 

Web模塊包含一個EJB注入一個servlet 。這個EJB使用myBatis映射器。

的Servlet

@WebServlet("/echo") 
public class EchoServlet extends HttpServlet { 
    @EJB 
    private EchoService echoService; 

    @Override 
    protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException { 
     resp.setContentType("text/html"); 
     try (PrintWriter writer = resp.getWriter()) { 
      writer.println(echoService.echo("lorempisum")); 
     } 
    } 
} 

EJB

@Stateless 
public class EchoBean implements EchoService { 

    @Inject 
    private AccountDao accountDao; 

    @Override 
    public String echo(String text) { 
     List<String> emails = accountDao.findAll(); 
     return "Hello " + text + "! There are " + emails.size() + " emails in the DB."); 
    } 
} 

MyBatis的映射器

@Mapper 
public interface AccountDao { 
    @Select("SELECT email FROM dev.account") 
    List<String> findAll(); 
} 

如果我更改了EAR的結構,那麼我的項目工作正常。

EAR 
    +-- lib 

    +-- web-module.war 
     +-- WEB-INF 
      +-- lib 
       +-- mybatis-3.4.4.jar 
       +-- mybatis-cdi-1.0.0.jar 

我嘗試添加MANIFEST.MF文件耳\ WEB-module.war \ META-INF目錄用下面的內容,但它並沒有幫助:

Class-Path: lib/mybatis-3.4.4.jar lib/mybatis-cdi-1.0.0.jar 

我也試着添加glassfish-web.xml文件到ear \ web-module.war \ WEB-INF所描述的目錄here但它並沒有幫助:

<glassfish-web-app> 
    <class-loader delegate="true" extra-class-path="../lib/mybatis-3.4.4.jar:../lib/mybatis-cdi-1.0.0.jar"/> 
</glassfish-web-app> 

不知道如何解決這個問題的類路徑?

回答

0

我不記得是否它是我們最終達成此目的的原因,但是:解開EAR組件(簡單的文件夾用於耳內檔案中的戰爭和ejbs)可能會有所幫助。

這裏是與Maven的配置:

<plugin> 
    <artifactId>maven-ear-plugin</artifactId> 
    <configuration> 
     <applicationName>myApp</applicationName> 
     <version>6</version> 
     <filtering>true</filtering> 
     <initializeInOrder>true</initializeInOrder> 
     <defaultLibBundleDir>APP-INF/lib</defaultLibBundleDir> 
     <unpackTypes>war,ejb</unpackTypes> 
     <modules> 
      <ejbModule> 
       <groupId>com.example</groupId> 
       <artifactId>myapp-ejb</artifactId> 
       <bundleFileName>myapp-ejb.jar</bundleFileName> 
      </ejbModule> 
      <webModule> 
       <groupId>com.example</groupId> 
       <artifactId>myapp-rest</artifactId> 
       <contextRoot>/myapp</contextRoot> 
       <bundleFileName>myapp.war</bundleFileName> 
      </webModule> 
     </modules> 
    </configuration> 
</plugin>