Добавление внешних библиотек Java в Adobe/Day CRX (2.2) для использования в файлах JSP

моя компания рассматривает возможность использования Adobe CQ5 в качестве новой системы управления контентом, и мне было поручено выяснить, как с ней делать определенные вещи.

Одна вещь, которую мы хотели бы сделать, — это использовать некоторые JAR-файлы, которые мы создали для наших старых веб-приложений, в скриптлетах на наших страницах JSP, возможно, для вызова службы или чего-то еще.

Я пытался сделать это с пакетами OSGi, но я не думаю, что это то, что мы хотим сделать. Сейчас мне трудно понять, куда поместить внешние библиотеки для использования в наших файлах JSP.

Я создал JAR, который имеет только общий класс

package org.company.test;

import java.lang.String;

public class TestService{
    private String myString;
    public TestService(String input){myString = input;}
    public String getMyString(){return myString;}
}

Это единственное, что есть в банке.

Я попытался поместить его в /crx-quickstart/server/lib/common.

что README для этой папки говорит

«Поместите в эту папку библиотеки, которые должны быть общими для всех веб-приложений и сервера».

но у моего файла JSP есть несколько проблем, когда я пытаюсь получить к нему доступ. Это файл JSP целиком:

<%@ page language="java" contentType="text/html; charset=ISO-8859-1" pageEncoding="ISO-8859-1"%>
<%%>
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/ TR/html4/loose.dtd">
<%%>
<%@page session="false"%>
<%@taglib prefix="sling" uri="http://sling.apache.org/taglibs/sling/1.0"%>
<sling:defineObjects/>

<%@ page import="javax.jcr.Repository, javax.jcr.Session, javax.jcr.SimpleCredentials, javax.jcr.Node, javax.jcr.NodeIterator,
                 java.net.URLEncoder, java.util.List, java.util.Iterator, javax.jcr.Value, javax.jcr.RepositoryException,org.company.test.TestService;"%>
<html>
    <head> 
        <style type="text/css"><jsp:include page="/content/myBlog/style.css"/></style>
        <!--<link rel="stylesheet" href="/content/myBlog/style.css" type="text/css">-->
        <meta http-equiv="Content-Type" content="text/html; charset=ISO-8859-1">
        <% 
            TestService jServ = new TestService("TigerBlood");
            String returnValue = "Failed";
            if(jServ!=null){
                returnValue = jServ.getMyString();
            }            
        %>
        <title><%= returnValue %></title> 
    </head> 
    <body> 
        <a href="/content/myBlog.html" class="imgcontainer"><img src="/apps/myBlog/myBlog.png" width="80px" height="60px" border="0" alt="myBlog" /></a>
        <h1><%= returnValue %></h1>
        <div class="body">
            <br>
            <a href="/apps/myBlog/comment.html">Comment</a>
        </div>
    </body> 
</html>

Когда я перехожу к нему в браузере, я получаю следующие ошибки:

Unable to compile class for JSP: An error occurred at line: 16 in the generated java file Only a type can be imported. org.company.test.TestService resolves to a package 

An error occurred at line: 17 in the jsp file: /apps/myBlog/test.jsp TestService cannot be resolved to a type  
14: <!--<link rel="stylesheet" href="/content/myBlog/style.css" type="text/css">-->  
15: <meta http-equiv="Content-Type" content="text/html; charset=ISO-8859-1">  
16: <%  
17: TestService jServ = new TestService("TigerBlood");  
18: String returnValue = "Failed";  
19: if(jServ!=null){  20: returnValue = jServ.getMyString(); 

An error occurred at line: 17 in the jsp file: /apps/myBlog/test.jsp TestService cannot be resolved to a type  
14: <!--<link rel="stylesheet" href="/content/myBlog/style.css" type="text/css">-->  
15: <meta http-equiv="Content-Type" content="text/html; charset=ISO-8859-1">  
16: <%  
17: TestService jServ = new TestService("TigerBlood");  
18: String returnValue = "Failed";  
19: if(jServ!=null){  
20: returnValue = jServ.getMyString();

Я могу исправить первую ошибку, связанную с пакетом, изменив импорт на com.company.test.*, но две другие ошибки это не исправит.

Я знаю, что это не лучшая «практика» использования сервисов, но я надеялся просто получить доказательство концепции, которое показывает, что мы можем использовать эти библиотеки, если захотим. Любая помощь будет оценена по достоинству.


person Damon    schedule 22.02.2012    source источник


Ответы (2)


Я нашел ответ, вам нужно связать внешние библиотеки в виде пакета OSGi.

Процесс можно найти здесь

На удивление сложно найти этот ответ, и хотя это занимает больше времени, чем простое добавление JAR, это работает.

person Damon    schedule 24.02.2012

Мы собираем наши пакеты cq с помощью Maven, используя «maven-bundle-plugin». Вы можете использовать его для создания собственного пакета с правильными инструкциями по экспорту.

        <groupId>org.apache.felix</groupId>
        <artifactId>maven-bundle-plugin</artifactId>


        <configuration>
            <instructions>
                <Export-Package>
                    org.company.test.*,
                    com.google.gson.*
                </Export-Package>

В тег «Export-Package» вы должны включить все пакеты, которые хотите использовать в своем jsp.

Также вы должны указать зависимости в соответствующем maven pom, если вы используете какие-либо внешние банки в комплекте.

например для гсона:

    <dependency>
        <groupId>com.google.code.gson</groupId>
        <artifactId>gson</artifactId>
    </dependency>
person Alexander Drobyshevsky    schedule 23.01.2014