2016-12-31 9 views
1

Я развертываю веб-приложение Spring Boot в Liberty 16.0.0.3. Предоставлял всю область зависимости как предоставленную и настроенную глобальную общую библиотеку. Но когда я запускаю приложение Свобода не смогла загрузить контекст приложения.Либерти-профиль, который не может обнаружить компоненты Spring Boot, может аннотировать и не загружать контекст приложения

Моя конфигурация, как показано ниже.

Мой pom.xml

<?xml version="1.0" encoding="UTF-8"?> 
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" 
    xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd"> 
    <modelVersion>4.0.0</modelVersion> 

    <groupId>com.myapp.testapp</groupId> 
    <artifactId>testsharedlib</artifactId> 
    <version>1.0.0-SNAPSHOT</version> 
    <packaging>war</packaging> 

    <name>testsharedlib</name> 
    <description>Demo project for Spring Boot</description> 

    <parent> 
     <groupId>org.springframework.boot</groupId> 
     <artifactId>spring-boot-starter-parent</artifactId> 
     <version>1.4.3.RELEASE</version> 
     <relativePath/> <!-- lookup parent from repository --> 
    </parent> 

    <properties> 
     <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding> 
     <project.reporting.outputEncoding>UTF-8</project.reporting.outputEncoding> 
     <java.version>1.8</java.version> 
     <runtime.scope>provided</runtime.scope> 
    </properties> 

    <dependencies> 
     <dependency> 
      <groupId>org.springframework.boot</groupId> 
      <artifactId>spring-boot-starter-web</artifactId> 
      <scope>${runtime.scope}</scope> 
     </dependency> 

     <dependency> 
      <groupId>org.springframework.boot</groupId> 
      <artifactId>spring-boot-starter-ws</artifactId> 
      <scope>${runtime.scope}</scope> 
     </dependency> 

     <dependency> 
      <groupId>org.springframework.boot</groupId> 
      <artifactId>spring-boot-starter-tomcat</artifactId> 
      <scope>provided</scope> 
     </dependency> 
     <dependency> 
      <groupId>org.springframework.boot</groupId> 
      <artifactId>spring-boot-starter-test</artifactId> 
      <scope>test</scope> 
     </dependency> 
    </dependencies> 



    <build> 
     <plugins> 
     <plugin> 
      <groupId>org.springframework.boot</groupId> 
      <artifactId>spring-boot-maven-plugin</artifactId> 
      <!-- <version>2.3</version> --> 
      <executions> 
       <execution> 
        <goals> 
        <goal>repackage</goal> 
        </goals> 
        <configuration> 
        <skip>true</skip> 
        <!-- <failOnMissingWebXml>false</failOnMissingWebXml> --> 
        </configuration> 
       </execution> 
      </executions> 
     </plugin> 
     <plugin> 
       <groupId>org.apache.maven.plugins</groupId> 
       <artifactId>maven-war-plugin</artifactId> 
       <configuration> 
        <failOnMissingWebXml>false</failOnMissingWebXml> 
        <packagingExcludes>WEB-INF/lib/*.jar</packagingExcludes> 
        <archive> 
         <manifest> 
          <mainClass>com.myapp.testapp.Appconfig</mainClass> 
          <addClasspath>true</addClasspath> 
          <classpathPrefix>lib/</classpathPrefix> 
         </manifest> 
         <manifestEntries> 
          <DisableIBMJAXWSEngine>true</DisableIBMJAXWSEngine> 
          <Class-Path>conf</Class-Path> 
         </manifestEntries> 
        </archive> 
       </configuration> 
      </plugin> 

     <plugin> 
     <groupId>org.apache.maven.plugins</groupId> 
     <artifactId>maven-compiler-plugin</artifactId> 
     <configuration> 
      <source>1.8</source> 
      <target>1.8</target> 
     </configuration> 
     </plugin> 

     <plugin> 
      <artifactId>maven-resources-plugin</artifactId> 
     </plugin> 
     </plugins> 
    </build> 


</project> 

Liberty server.xml

<server description="Default Server"> 

    <featureManager> 
    <feature>webProfile-7.0</feature> 
     <feature>localConnector-1.0</feature> 
    </featureManager> 


    <library id="global"> 
     <fileset dir="${server.config.dir}/lib/jars" includes="*.jar"/> 
    </library> 

    <application context-root="HelloWorld" location="text-1.0.0-SNAPSHOT.war"> 
     <classloader commonLibraryRef="global" delegation="parentFirst"/> 
    </application> 

    <!-- Define the host name for use by the collective. 
     If the host name needs to be changed, the server should be 
     removed from the collective and re-joined. --> 
    <variable name="defaultHostName" value="localhost"/> 

    <keyStore id="defaultKeyStore" password="adminpwd"/> 

    <!-- Define an Administrator and non-Administrator --> 
    <basicRegistry id="basic"> 
     <user name="admin" password="adminpwd"/> 
     <user name="nonadmin" password="nonadminpwd"/> 
    </basicRegistry> 

    <!-- Assign 'admin' to Administrator --> 
    <administrator-role> 
     <user>admin</user> 
    </administrator-role> 

    <webContainer deferServletLoad="false"/> 
    <applicationManager autoExpand="true"/> 

    <httpEndpoint host="*" httpPort="9080" httpsPort="9443" id="defaultHttpEndpoint"/> 

    <logging consoleLogLevel="INFO" traceSpecification="*=info:com.ibm.ws.classloading.*=ALL"/> 


</server> 
+0

Эта конфигурация плагина войны выглядит странно. Как «mainClass» относится к неисключительной войне? –

+0

Есть ли какие-либо исключения/стека, связанные с отказом? – covener

+0

@StephaneNicoll Я предоставил основной класс просто Liberty, чтобы вызвать загрузку контекста приложения.Поскольку он не загружается, даже если я не предоставляю ничего с помощью только одного плагина. – springbootlearner

ответ

0

я могу в состоянии сделать его работу, обеспечивая WEB-INF/web.xml в Либерти с глобальной общей Library.Find ниже конфигурации образца.

pom.xml

http://maven.apache.org/xsd/maven-4.0.0.xsd "> 4.0.0

<groupId>com.myapp.testapp</groupId> 
    <artifactId>testsharedlib</artifactId> 
    <version>1.0.0-SNAPSHOT</version> 
    <packaging>war</packaging> 

    <name>testsharedlib</name> 
    <description>Demo project for Spring Boot</description> 

    <parent> 
     <groupId>org.springframework.boot</groupId> 
     <artifactId>spring-boot-starter-parent</artifactId> 
     <version>1.4.3.RELEASE</version> 
     <relativePath/> <!-- lookup parent from repository --> 
    </parent> 

    <properties> 
     <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding> 
     <project.reporting.outputEncoding>UTF-8</project.reporting.outputEncoding> 
     <java.version>1.8</java.version> 
     <runtime.scope>provided</runtime.scope> 
    </properties> 

    <dependencies> 
     <dependency> 
      <groupId>org.springframework.boot</groupId> 
      <artifactId>spring-boot-starter-web</artifactId> 
      <scope>${runtime.scope}</scope> 
     </dependency> 

     <dependency> 
      <groupId>org.springframework.boot</groupId> 
      <artifactId>spring-boot-starter-ws</artifactId> 
      <scope>${runtime.scope}</scope> 
     </dependency> 

     <dependency> 
      <groupId>org.springframework.boot</groupId> 
      <artifactId>spring-boot-starter-tomcat</artifactId> 
      <scope>provided</scope> 
     </dependency> 
     <dependency> 
      <groupId>org.springframework.boot</groupId> 
      <artifactId>spring-boot-starter-test</artifactId> 
      <scope>test</scope> 
     </dependency> 
    </dependencies> 
<build> 
     <plugins> 
     <plugin> 
      <groupId>org.springframework.boot</groupId> 
      <artifactId>spring-boot-maven-plugin</artifactId> 
      <executions> 
       <execution> 
        <goals> 
        <goal>repackage</goal> 
        </goals> 
        <configuration> 
        <skip>true</skip> 
        </configuration> 
       </execution> 
      </executions> 
     </plugin> 

     <plugin> 
      <artifactId>maven-resources-plugin</artifactId> 
     </plugin> 
     </plugins> 
    </build> 
</project> 

server.xml

<featureManager> 
    <feature>webProfile-7.0</feature> 
     <feature>localConnector-1.0</feature> 
    </featureManager> 


    <library id="global"> 
     <fileset dir="${server.config.dir}/lib/jars" includes="*.jar"/> 
    </library> 

    <application context-root="HelloWorld" location="text-1.0.0-SNAPSHOT.war"> 
     <classloader commonLibraryRef="global" delegation="parentLast"/> 
    </application> 

    <!-- Define the host name for use by the collective. 
     If the host name needs to be changed, the server should be 
     removed from the collective and re-joined. --> 
    <variable name="defaultHostName" value="localhost"/> 

    <keyStore id="defaultKeyStore" password="adminpwd"/> 

    <!-- Define an Administrator and non-Administrator --> 
    <basicRegistry id="basic"> 
     <user name="admin" password="adminpwd"/> 
     <user name="nonadmin" password="nonadminpwd"/> 
    </basicRegistry> 

    <!-- Assign 'admin' to Administrator --> 
    <administrator-role> 
     <user>admin</user> 
    </administrator-role> 

    <webContainer deferServletLoad="false"/> 
    <applicationManager autoExpand="true"/> 

    <httpEndpoint host="*" httpPort="9080" httpsPort="9443" id="defaultHttpEndpoint"/> 

    <logging consoleLogLevel="INFO" traceSpecification="*=info:com.ibm.ws.classloading.*=ALL"/> 

</server> 

web.xml

<?xml version="1.0" encoding="UTF-8"?> 
<web-app xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns="http://xmlns.jcp.org/xml/ns/javaee" 
     xsi:schemaLocation="http://xmlns.jcp.org/xml/ns/javaee http://xmlns.jcp.org/xml/ns/javaee/web-app_3_1.xsd" id="WebApp_ID" version="3.1"> 

<display-name>pctext</display-name> 

<servlet> 
    <servlet-name>dispatcher</servlet-name> 
    <servlet-class> 
     org.springframework.web.servlet.DispatcherServlet 
    </servlet-class> 
    <init-param> 
      <param-name>contextClass</param-name> 
      <param-value>org.springframework.web.context.support.AnnotationConfigWebApplicationContext</param-value> 
     </init-param> 
     <init-param> 
      <param-name>contextConfigLocation</param-name> 
      <param-value>com.myapp.testpkg.ApplicationConfig</param-value> 
     </init-param> 
    <load-on-startup>1</load-on-startup> 
</servlet> 

<servlet-mapping> 
    <servlet-name>dispatcher</servlet-name> 
    <url-pattern>/</url-pattern> 
</servlet-mapping> 

</web-app> 

@SpringBootApplication (scanBasePackages = { "com.myapp.testpkg"})

общественного класса ApplicationConfig {

 public static void main(String[] args) { 

      SpringApplication.run(ApplicationConfig.class, args); 
     } 
    } 
+0

Непонятно из этого ответа, что было изменено, чтобы заставить все работать. Это был ' 1' в web.xml? Похоже, pom.xml и server.xml такие же, как в исходном вопросе. –

+0

@AndyGuibert, чтобы он работал. Мне нужно добавить web.xml и предоставить конфигурацию DispatcherServlet в web.xml. Если я предоставляю ServletInitilizer, используя аннотацию, например @SpringBootApplication (scanbasepackages = {com.testapp.textpakage}), Liberty не загружал контекст приложения когда я использую глобальный общий доступ Lib.But, но он работает, если я упакую приложение со всем зависимым банком в WEB-INF/lib. – springbootlearner

0

Причина, почему это работает зависимостей в WEB-INF/lib, а не в общедоступной общей папке, потому что сервлет, который инициализирует ваше приложение Spring (org.springframework.web.servlet.DispatcherServlet), происходит от одного из t он jar зависимости. Liberty будет только сканировать корень контекста (то есть WEB-INF/*) для классов сервлетов. Он не будет сканировать разделяемые библиотеки для классов сервлета.

Как вы узнали в своем другом ответе, единственный способ связать сервлет, исходящий из банки в общей библиотеке, - это явно объявить его в web.xml (так как Liberty не будет автоматически сканировать для него, как это . делает для классов или банок в WEB-INF/*

Чтобы подтвердить это, я написал простой сервлет:.

@WebServlet("/LibServlet") 
public class LibServlet extends HttpServlet { 

    protected void doGet(HttpServletRequest request, HttpServletResponse response) 
     throws ServletException, IOException 
    { 
     response.getWriter().append("Served at: ").append(request.getContextPath()); 
    } 
} 

Затем я упаковано этот сервлет в servletLib.jar Когда я предоставил эту библиотеку для моего приложения с использованием разделяемой библиотеки, Я не смог получить доступ к сервлету по адресу http://localhost:9080/testapp/LibServlet. Однако, когда я переместил servletLib.jar в WEB-INF/lib, тогда сервлет был доступен.

+0

У меня есть другая проблема с моей конфигурацией выше. Если я использую в Configuration и Configuration Configuration для загрузки свойств/значений файла yml, Liberty не смог загрузить эти значения. В принципе, он не смог загрузить класс @Configuration во время запуска. – springbootlearner