2017-01-09 26 views
0

Я создал портлет MVC для Liferay 7 CE с соответствующим архетипом maven (как описано here). Я добавил некоторые дополнительные файлы не-OSGI jar в качестве зависимостей проекта в файле POM проекта. Когда я развертываю проект на сервере портала liferay, контейнер OSGI не может разрешить зависимости созданного модуля, и пакет остается на этапе установки. Я хочу добавить файлы jar без OSGI и их транзитивные зависимости к пакету в автоматическом режиме. Что мне делать? Содержание модуля в следующем: структураДобавление зависимостей jQuery без OSGI в портлете MVC на основе maven в Liferay 7 CE

проекта:

enter image description here

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>org.ranginkaman</groupId> 
     <artifactId>second-maven-portlet</artifactId> 
     <version>1.0.0</version> 
     <packaging>jar</packaging> 
     <properties> 
      <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding> 
     </properties> 
     <dependencies> 
      <dependency> 
       <groupId>com.liferay.portal</groupId> 
       <artifactId>com.liferay.portal.kernel</artifactId> 
       <version>2.0.0</version> 
       <scope>provided</scope> 
      </dependency> 
      <dependency> 
       <groupId>com.liferay.portal</groupId> 
       <artifactId>com.liferay.util.taglib</artifactId> 
       <version>2.0.0</version> 
       <scope>provided</scope> 
      </dependency> 
      <dependency> 
       <groupId>javax.portlet</groupId> 
       <artifactId>portlet-api</artifactId> 
       <version>2.0</version> 
       <scope>provided</scope> 
      </dependency> 
      <dependency> 
       <groupId>javax.servlet</groupId> 
       <artifactId>javax.servlet-api</artifactId> 
       <version>3.0.1</version> 
       <scope>provided</scope> 
      </dependency> 
      <dependency> 
       <groupId>jstl</groupId> 
       <artifactId>jstl</artifactId> 
       <version>1.2</version> 
       <scope>provided</scope> 
      </dependency> 
      <dependency> 
       <groupId>org.osgi</groupId> 
       <artifactId>org.osgi.compendium</artifactId> 
       <version>5.0.0</version> 
       <scope>provided</scope> 
      </dependency> 

      <!-- https://mvnrepository.com/artifact/com.vividsolutions/jts --> 
      <dependency> 
       <groupId>com.vividsolutions</groupId> 
       <artifactId>jts</artifactId> 
       <version>1.13</version> 
      </dependency> 
     </dependencies> 
     <build> 
      <plugins> 
       <plugin> 
        <groupId>org.apache.maven.plugins</groupId> 
        <artifactId>maven-compiler-plugin</artifactId> 
        <version>3.1</version> 
        <configuration> 
         <source>1.8</source> 
         <target>1.8</target> 
        </configuration> 
       </plugin> 
       <plugin> 
        <groupId>org.apache.maven.plugins</groupId> 
        <artifactId>maven-jar-plugin</artifactId> 
        <version>2.6</version> 
        <configuration> 
         <archive> 
          <manifestFile>${project.build.outputDirectory}/META-INF/MANIFEST.MF</manifestFile> 
         </archive> 
         <excludes> 
          <exclude>**/META-INF/resources/**/.sass-cache/</exclude> 
         </excludes> 
        </configuration> 
       </plugin> 
       <plugin> 
        <groupId>biz.aQute.bnd</groupId> 
        <artifactId>bnd-maven-plugin</artifactId> 
        <version>3.2.0</version> 
        <executions> 
         <execution> 
          <id>default-bnd-process</id> 
          <goals> 
           <goal>bnd-process</goal> 
          </goals> 
         </execution> 
        </executions> 
        <dependencies> 
         <dependency> 
          <groupId>biz.aQute.bnd</groupId> 
          <artifactId>biz.aQute.bndlib</artifactId> 
          <version>3.2.0</version> 
         </dependency> 
         <dependency> 
          <groupId>com.liferay</groupId> 
          <artifactId>com.liferay.ant.bnd</artifactId> 
          <version>2.0.28</version> 
         </dependency> 
        </dependencies> 
       </plugin> 
       <plugin> 
        <groupId>com.liferay</groupId> 
        <artifactId>com.liferay.css.builder</artifactId> 
        <version>1.0.20</version> 
        <executions> 
         <execution> 
          <id>default-build-css</id> 
          <phase>generate-sources</phase> 
          <goals> 
           <goal>build-css</goal> 
          </goals> 
         </execution> 
        </executions> 
        <configuration> 
         <portalCommonPath>/</portalCommonPath> 
         <docrootDirName>src/main/resources</docrootDirName> 
        </configuration> 
       </plugin> 
      </plugins> 
     </build> 
    </project> 

bnd.bnd:

Bundle-Name: second-maven-portlet 
    Bundle-SymbolicName: org.ranginkaman 
    Bundle-Version: 1.0.0 
    -jsp: *.jsp,*.jspf 
    -plugin.jsp: com.liferay.ant.bnd.jsp.JspAnalyzerPlugin 
    -plugin.resourcebundle: com.liferay.ant.bnd.resource.bundle.ResourceBundleLoaderAnalyzerPlugin 
    -plugin.sass: com.liferay.ant.bnd.sass.SassAnalyzerPlugin 
    -sass: * 

build.gradle :

buildscript { 
     dependencies { 
      classpath group: "com.liferay", name: "com.liferay.gradle.plugins", version: "3.0.23" 
     } 

     repositories { 
      mavenLocal() 

      maven { 
       url "https://cdn.lfrs.sl/repository.liferay.com/nexus/content/groups/public" 
      } 
     } 
    } 

    apply plugin: "com.liferay.plugin" 

    dependencies { 
     compileOnly group: "com.liferay.portal", name: "com.liferay.portal.kernel", version: "2.0.0" 
     compileOnly group: "com.liferay.portal", name: "com.liferay.util.taglib", version: "2.0.0" 
     compileOnly group: "javax.portlet", name: "portlet-api", version: "2.0" 
     compileOnly group: "javax.servlet", name: "javax.servlet-api", version: "3.0.1" 
     compileOnly group: "jstl", name: "jstl", version: "1.2" 
     compileOnly group: "org.osgi", name: "org.osgi.compendium", version: "5.0.0" 
    } 

    repositories { 
     mavenLocal() 

     maven { 
      url "https://cdn.lfrs.sl/repository.liferay.com/nexus/content/groups/public" 
     } 
    } 

SecondMavenPortletPortlet.java:

package org.ranginkaman.portlet; 

    import com.liferay.portal.kernel.portlet.bridges.mvc.MVCPortlet; 
    import com.vividsolutions.jts.geom.Coordinate; 
    import com.vividsolutions.jts.geom.GeometryFactory; 
    import com.vividsolutions.jts.geom.Point; 

    import java.io.IOException; 

    import javax.portlet.Portlet; 
    import javax.portlet.PortletException; 
    import javax.portlet.RenderRequest; 
    import javax.portlet.RenderResponse; 

    import org.osgi.service.component.annotations.Component; 

    @Component(
     immediate = true, 
     property = { 
      "com.liferay.portlet.display-category=category.sample", 
      "com.liferay.portlet.instanceable=true", 
      "javax.portlet.display-name=second-maven-portlet Portlet", 
      "javax.portlet.init-param.template-path=/", 
      "javax.portlet.init-param.view-template=/view.jsp", 
      "javax.portlet.resource-bundle=content.Language", 
      "javax.portlet.security-role-ref=power-user,user" 
     }, 
     service = Portlet.class 
    ) 
    public class SecondMavenPortletPortlet extends MVCPortlet { 
     @Override 
     public void doView(RenderRequest renderRequest, RenderResponse renderResponse) 
       throws IOException, PortletException { 


      GeometryFactory geometryFactory = new GeometryFactory(); 

      Point point = geometryFactory.createPoint(new Coordinate(1.0, 2.0)); 

      System.out.println(point); 

      super.doView(renderRequest, renderResponse); 
     } 
    } 

ответ

0

Если com.vividsolutions.jts не OSGi готово, вы можете обернуть его через bnd или SpringRoo

0

Вот это сообщество блог Liferay для добавления зависимости от модуля OSGi : https://web.liferay.com/web/user.26526/blog/-/blogs/osgi-module-dependencies

Посмотрите, соответствуют ли эти параметры вашим требованиям. Вы должны пойти на вариант 3rd или 4th, упомянутый в этом блоге. Он работал в моем случае.

+0

Thanks, Я прочитал эту статью. Но я хочу добавить зависимости Maven и их транзитивные зависимости автоматически к Manifest.MF окончательного пакета jar-файлов. Есть ли у вас предложения? –

+0

Извините, но я понятия не имею. Сообщите, если я столкнулся с чем-либо связанным с вашим требованием. –

1

Мы столкнулись с подобными проблемами и с нашим проектом. Я заметил, что последний ответ был с 15 января и подумал, что было бы неплохо включить полезный ответ на запись в блоге Liferay, на которую ссылались. Это привело нас к осознанию того, что мы должны выбрать вариант 3 или 4 из блога, как указано в предыдущем ответе.

Так что это на самом деле распространенное заблуждение - существует разница между построением в градиенте с использованием менеджера зависимостей и среды выполнения OSGi, которая не имеет аналогичного менеджера зависимостей.

OSGi намеренно не загружает зависимости, особенно транзитивные зависимости, поскольку это приведет к нестабильной среде.

Процесс сборки будет включать транзитивные зависимости при компиляции вашего кода, но BND не является компилятором, он просто строит файл jar и включает в себя то, что вы ему рассказываете.

Так что да, при нормальных обстоятельствах вы должны включать все зависимости и транзитивные зависимости самостоятельно. Тем не менее, некоторые проекты не используют «необязательные» маркеры в своих транзитивных зависимостях, поэтому OSGi считает их обязательными. Вы должны добавить объявление класса в файл BND, чтобы принудительно исключить те пакеты, которые вам действительно не нужны.

Это определенно PITA, но это именно так. OSGi-среда - это среда выполнения, и вы хотите активно управлять ею и быть в курсе. Как администратор вы хотите знать, что ваши модули используют и управляют развертываниями надлежащим образом.С административной точки зрения, вы не захотите, чтобы среда просто загружала вещи самостоятельно (и часто это не всегда возможно в производственных средах).