带有JPA的AEM CQ(休眠)

时间:2018-09-19 08:47:57

标签: java hibernate jpa osgi aem

我正在使用带有Service Pack 1和Forms Package的Adobe Experience Manager(AEM)6.4。 我有很多扩展的属性/属性,因此我制作了数据库图。我不想将所有其他内容保存在crx中,而是想将其保存在Oracle数据库中。

数据库图很复杂,所以我至少要使用JPA(休眠)。如果Spring可以使它更易于使用,那对我来说就没事了。

我了解到很多OSGI正在使用蓝图而不是Spring,但是您可以将其结合使用。

我真的在寻找一个很好的示例,说明如何使JPA和Oracle数据库工作。

Adob​​e根本没有帮助,他们无法显示如何使用AEM和JPA / Hibernate / Spring / blueprint的示例。

有人可以帮我使事情正常吗?使用AEM和JPA?

我认为我需要的是:

  1. persistence.xml(RESOURCE_LOCAL还是JTA?)
  2. 带有注释@Entity和其他JPA注释的实体类
  3. 带有事务控制的服务类,也许还有管理器类,可以提交以与实体类一起工作并从查询中获取结果,也许我可以将其全部放入服务类中
  4. hibernate-osgi(依赖项)
  5. 用于连接(依赖项)的ojdbc7
  6. org.apache.aries.jpa.api(依赖项)

但是我该如何使事情发生呢?什么都没有。我什至不知道这是正确的方法。

我应该使用蓝图或Spring还是两者一起使用?

我从Apache找到了这个白羊座的东西。 http://aries.apache.org 并穿了一些我不太了解它们如何工作的样品。 https://github.com/apache/aries-jpa/tree/master/examples

还有一些OSGI示例,对于我的情况,它们看起来非常不完整。 https://enroute.osgi.org/tutorial/032-tutorial_microservice-jpa.html

那么有人在AEM和JPA方面有一定经验吗?

4 个答案:

答案 0 :(得分:1)

我找到了解决方案,并在网站上的此处发布了帖子。

https://forums.adobe.com/message/10640295#10640295

我觉得我是将AEM与JPA / Hibernate相结合的第一人。现在,我可以检查使用spring和使用Transactions进行操作是否有好处。

那两个否决了这个问题的人,我确定你是adobe的人->谢谢,现在我在你自己的cms上比你更熟练,因为在我发帖之前没有解决这个问题的方法。 / p>

更新:Maven依赖关系。如果您对依赖项有疑问,则必须将其嵌入并添加属性“ Embed-Transitive to true”

 <plugin>
            <groupId>org.apache.felix</groupId>
            <artifactId>maven-bundle-plugin</artifactId>
            <extensions>true</extensions>
            <inherited>true</inherited>
            <configuration>
                <instructions>
                    <Embed-Dependency>
                        *;scope=compile|runtime
                    </Embed-Dependency>
                    <Embed-Transitive>true</Embed-Transitive>
                    <Export-Package>
                        <!--TODO export packages -->

                    </Export-Package>
                    <Private-Package>todo</Private-Package>
                    <Import-Package>
                        <!-- Attention this is really sensitive!!. -->
                        *;resolution:="optional"
                    </Import-Package>
                    <Bundle-Activator>path.to.Activator</Bundle-Activator>
                </instructions>
            </configuration>
        </plugin>

答案 1 :(得分:1)

让我描述一下如何在我们的项目中实现它。我们将AEM 6.3与SP2一起使用。 我们在根pom.xml中有下一个依赖项:

    <!-- JPA -->
    <dependency>
        <groupId>org.hibernate.javax.persistence</groupId>
        <artifactId>hibernate-jpa-2.1-api</artifactId>
        <version>1.0.0.Final</version>
    </dependency>
    <dependency>
        <groupId>org.hibernate</groupId>
        <artifactId>hibernate-core</artifactId>
        <version>5.1.10.Final</version>
    </dependency>
    <dependency>
        <groupId>org.hibernate</groupId>
        <artifactId>hibernate-entitymanager</artifactId>
        <version>5.1.10.Final</version>
    </dependency>
    <dependency>
        <groupId>org.hibernate.common</groupId>
        <artifactId>hibernate-commons-annotations</artifactId>
        <version>5.0.1.Final</version>
    </dependency>
    <dependency>
        <groupId>com.ibm.db2.jcc</groupId>
        <artifactId>db2jcc4</artifactId>
        <version>11.1</version>
        <scope>system</scope>
        <systemPath>${project.root.path}/lib/db2jcc4.jar</systemPath>
    </dependency>
    <dependency>
        <groupId>org.jboss.logging</groupId>
        <artifactId>jboss-logging</artifactId>
        <version>3.3.2.Final</version>
    </dependency>
    <dependency>
        <groupId>com.fasterxml</groupId>
        <artifactId>classmate</artifactId>
        <version>1.3.0</version>
    </dependency>
    <dependency>
        <groupId>antlr</groupId>
        <artifactId>antlr</artifactId>
        <version>2.7.7</version>
    </dependency>
    <!-- local development database -->
    <dependency>
        <groupId>com.h2database</groupId>
        <artifactId>h2</artifactId>
        <version>1.4.194</version>
    </dependency>
    <!-- /JPA-->

然后,我们有了提供JPA依赖项和OSGI服务的捆绑包,该服务允许获取休眠会话。捆绑包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>
  <parent>
    <groupId>com.myproject</groupId>
    <artifactId>myproject-bundles</artifactId>
    <version>1.0-SNAPSHOT</version>
  </parent>
  <artifactId>com.myproject.db</artifactId>
  <packaging>bundle</packaging>
  <name>myproject - DB bundle</name>
  <description>OSGI bundle to work with a database</description>

  <properties>
    <bundle.export>
      com.myproject.db.*,
      javax.persistence,
      org.hibernate,
      org.hibernate.cfg,
      org.hibernate.proxy,
      org.hibernate.boot.registry,
      org.hibernate.annotations,
      org.hibernate.service,
      org.hibernate.criterion,
      org.hibernate.transform
    </bundle.export>
    <bundle.import>*;resolution:=optional</bundle.import>
    <!-- Import JDBC driver dynamically -->
    <bundle.dynamic.import>com.ibm.*,javassist.util.*</bundle.dynamic.import>
    <bundle.embed>
      hibernate-jpa-2.1-api,hibernate-core,hibernate-entitymanager,hibernate-commons-annotations,jboss-logging,antlr
    </bundle.embed>
    <project.root.path>${project.basedir}/../..</project.root.path>
  </properties>

  <dependencies>
    <dependency>
      <groupId>org.hibernate.javax.persistence</groupId>
      <artifactId>hibernate-jpa-2.1-api</artifactId>
    </dependency>
    <dependency>
      <groupId>org.hibernate</groupId>
      <artifactId>hibernate-core</artifactId>
    </dependency>
    <dependency>
      <groupId>org.hibernate</groupId>
      <artifactId>hibernate-entitymanager</artifactId>
    </dependency>
    <dependency>
      <groupId>org.hibernate.common</groupId>
      <artifactId>hibernate-commons-annotations</artifactId>
    </dependency>
    <dependency>
      <groupId>org.jboss.logging</groupId>
      <artifactId>jboss-logging</artifactId>
    </dependency>
    <dependency>
      <groupId>com.ibm.db2.jcc</groupId>
      <artifactId>db2jcc4</artifactId>
    </dependency>
    <dependency>
      <groupId>antlr</groupId>
      <artifactId>antlr</artifactId>
    </dependency>
    <dependency>
      <groupId>org.apache.commons</groupId>
      <artifactId>commons-lang3</artifactId>
    </dependency>
      <dependency>
          <groupId>com.fasterxml.jackson.core</groupId>
          <artifactId>jackson-annotations</artifactId>
      </dependency>
      <dependency>
          <groupId>com.fasterxml.jackson.core</groupId>
          <artifactId>jackson-databind</artifactId>
      </dependency>
      <dependency>
          <groupId>com.myproject</groupId>
          <artifactId>com.myproject.common</artifactId>
          <version>1.0-SNAPSHOT</version>
          <scope>compile</scope>
      </dependency>
  </dependencies>
</project>

在捆绑包中,我们有下一项服务:

package com.myproject.db;

import org.hibernate.Session;

public interface JPASessionFactory {
    Session openSession();

    void closeSession(Session session);
}

实现:

package com.myproject.db.impl;

import com.myproject.db.JPASessionFactory;
import org.apache.felix.scr.annotations.*;
import org.apache.sling.commons.osgi.PropertiesUtil;
import org.hibernate.Session;
import org.hibernate.SessionFactory;
import org.hibernate.boot.registry.StandardServiceRegistryBuilder;
import org.hibernate.cfg.Configuration;
import org.hibernate.cfg.Environment;

import javax.sql.DataSource;
import java.util.Map;

@Service
@Component(metatype = true, policy = ConfigurationPolicy.REQUIRE)
@Properties({
        @Property(label = "Hibernate SQL dialect", name = Environment.DIALECT),
        @Property(label = "Show SQL", name = Environment.SHOW_SQL, boolValue = false),
        @Property(label = "Bulk ID Strategy", name = Environment.HQL_BULK_ID_STRATEGY)
})
public class JPASessionFactoryImpl implements JPASessionFactory {

    @Reference(target = "(datasource.name=myproject)")
    private DataSource dataSource;

    private SessionFactory sessionFactory;

    @Activate
    protected void activate(Map<String, Object> properties) {
        StandardServiceRegistryBuilder builder = new StandardServiceRegistryBuilder()
                .configure()
                .applySetting(Environment.DIALECT, PropertiesUtil.toString(properties.get(Environment.DIALECT), ""))
                .applySetting(Environment.SHOW_SQL, PropertiesUtil.toBoolean(properties.get(Environment.SHOW_SQL), false))
                .applySetting(Environment.DATASOURCE, dataSource);

        String bulkIdStrategy = PropertiesUtil.toString(properties.get(Environment.HQL_BULK_ID_STRATEGY), "");
        if (!bulkIdStrategy.isEmpty()) {
            builder.applySetting(Environment.HQL_BULK_ID_STRATEGY, bulkIdStrategy);
        }
        sessionFactory = new Configuration().buildSessionFactory(builder.build());
    }

    @Deactivate
    protected void deactivate() {
        if (sessionFactory != null) {
            sessionFactory.close();
        }
    }

    @Override
    public Session openSession() {
        return sessionFactory.openSession();
    }

    @Override
    public void closeSession(Session session) {
        if (session != null && session.isOpen()) {
            session.close();
        }
    }
}

该服务的osgi配置:

<?xml version="1.0" encoding="UTF-8"?>
<jcr:root xmlns:sling="http://sling.apache.org/jcr/sling/1.0" xmlns:jcr="http://www.jcp.org/jcr/1.0"
          jcr:primaryType="sling:OsgiConfig"
          hibernate.dialect="org.hibernate.dialect.H2Dialect"
          hibernate.show_sql="{Boolean}true"/>

DataSourceFactory apps / myproject-forms / configuration / config.local / org.apache.sling.datasource.DataSourceFactory-localh2.xml的配置:

<?xml version="1.0" encoding="UTF-8"?>
<jcr:root xmlns:sling="http://sling.apache.org/jcr/sling/1.0" xmlns:jcr="http://www.jcp.org/jcr/1.0"
          jcr:primaryType="sling:OsgiConfig"
          datasource.name="myproject"
          driverClassName="org.h2.Driver"
          url="jdbc:h2:./myprojectlocal;AUTO_SERVER=TRUE"
          username="sa"
          password=""
          testOnBorrow="{Boolean}true"
          testOnReturn="{Boolean}true"
          testWhileIdle="{Boolean}true"
          validationQuery="SELECT 1"/>

我们还在捆绑软件的“ resources”文件夹中有一个Hibernate配置文件hibernate.cfg.xml。

<?xml version="1.0" encoding="utf-8"?>
<!DOCTYPE hibernate-configuration PUBLIC
    "-//Hibernate/Hibernate Configuration DTD 3.0//EN"
    "http://www.hibernate.org/dtd/hibernate-configuration-3.0.dtd">
<hibernate-configuration>
  <session-factory>
    <property name="hbm2ddl.auto">update</property>
    <property name="current_session_context_class">thread</property>
    <mapping class="com.myproject.db.Entity1"/>
    <mapping class="com.myproject.db.Entity2"/>
  </session-factory>
</hibernate-configuration>

答案 2 :(得分:0)

有些博客文章描述了如何在AEM / CQ中实现JPA持久性。在using-jpa-to-write-database-applications-in-an-osgi-container-e-g-felix-or-adobe-aem-cq5中,他们描述了如何使用PersistenceUnit设置JNDI数据源以及如何@Reference EntityManagerFactory。

答案 3 :(得分:0)

我们已使用以下两种方法将Hibernate 5.4.5和JPA 2.2集成到Adobe Experience Manager 6.4.4中。请检查https://soft-werke.com/en/archives/news-en/how-to-install-hibernate-5-4-5-jpa-2-2-in-adobe-experience-manager-6-4-4/了解更多详细信息。

  1. 经典方法-使用content-package-maven-plugin在AEM软件包管理器中安装具有所有嵌入式Hibernate依赖关系的zip软件包。下面是一个Maven配置文件的示例,以后可以将其排除在外,以避免在每个AEM部署中安装Hibernate。
<profiles>
    <profile>
        <id>installHibernate</id>
        <activation>
            <activeByDefault>false</activeByDefault>
        </activation>
        <build>
            <plugins>
                <plugin>
                    <groupId>com.day.jcr.vault</groupId>
                    <artifactId>content-package-maven-plugin</artifactId>
                    <extensions>true</extensions>
                    <configuration>
                        <embeddedTarget>/apps/hibernate/install</embeddedTarget>
                        <embeddeds>
                            <embedded>
                                <groupId>org.apache.servicemix.bundles</groupId>
                                <artifactId>org.apache.servicemix.bundles.antlr</artifactId>
                            </embedded>
                            <embedded>
                                <groupId>com.fasterxml</groupId>
                                <artifactId>classmate</artifactId>
                            </embedded>
                            <embedded>
                                <groupId>com.sun.activation</groupId>
                                <artifactId>javax.activation</artifactId>
                            </embedded>
                            <embedded>
                                <groupId>javax.activation</groupId>
                                <artifactId>javax.activation-api</artifactId>
                            </embedded>
                            <embedded>
                                <groupId>javax.persistence</groupId>
                                <artifactId>javax.persistence-api</artifactId>
                            </embedded>
                            <embedded>
                                <groupId>javax.xml.bind</groupId>
                                <artifactId>jaxb-api</artifactId>
                            </embedded>
                            <embedded>
                                <groupId>net.bytebuddy</groupId>
                                <artifactId>byte-buddy</artifactId>
                            </embedded>
                            <embedded>
                                <groupId>org.apache.servicemix.bundles</groupId>
                                <artifactId>org.apache.servicemix.bundles.dom4j</artifactId>
                            </embedded>
                            <embedded>
                                <groupId>com.sun.istack</groupId>
                                <artifactId>istack-commons-runtime</artifactId>
                            </embedded>
                            <embedded>
                                <groupId>com.sun.xml.fastinfoset</groupId>
                                <artifactId>FastInfoset</artifactId>
                            </embedded>
                            <embedded>
                                <groupId>org.apache.servicemix.bundles</groupId>
                                <artifactId>org.apache.servicemix.bundles.jaxb-runtime</artifactId>
                            </embedded>
                            <embedded>
                                <groupId>org.javassist</groupId>
                                <artifactId>javassist</artifactId>
                            </embedded>
                            <embedded>
                                <groupId>org.jboss.logging</groupId>
                                <artifactId>jboss-logging</artifactId>
                            </embedded>
                            <embedded>
                                <groupId>org.hibernate.common</groupId>
                                <artifactId>hibernate-commons-annotations</artifactId>
                            </embedded>
                            <embedded>
                                <groupId>org.jboss</groupId>
                                <artifactId>jandex</artifactId>
                            </embedded>
                            <embedded>
                                <groupId>javax.el</groupId>
                                <artifactId>javax.el-api</artifactId>
                            </embedded>
                            <embedded>
                                <groupId>org.apache.servicemix.bundles</groupId>
                                <artifactId>org.apache.servicemix.bundles.javax-inject</artifactId>
                            </embedded>
                            <embedded>
                                <groupId>javax.interceptor</groupId>
                                <artifactId>javax.interceptor-api</artifactId>
                            </embedded>
                            <embedded>
                                <groupId>javax.enterprise</groupId>
                                <artifactId>cdi-api</artifactId>
                            </embedded>
                            <embedded>
                                <groupId>org.jboss.spec.javax.interceptor</groupId>
                                <artifactId>jboss-interceptors-api_1.2_spec</artifactId>
                            </embedded>
                            <embedded>
                                <groupId>org.jboss.spec.javax.transaction</groupId>
                                <artifactId>jboss-transaction-api_1.2_spec</artifactId>
                            </embedded>
                            <embedded>
                                <groupId>mysql</groupId>
                                <artifactId>mysql-connector-java</artifactId>
                            </embedded>
                            <embedded>
                                <groupId>org.hibernate</groupId>
                                <artifactId>hibernate-core</artifactId>
                            </embedded>
                            <embedded>
                                <groupId>org.hibernate</groupId>
                                <artifactId>hibernate-osgi</artifactId>
                            </embedded>
                        </embeddeds>
                    </configuration>
                    <executions>
                        <execution>
                            <id>install-package-hibernate</id>
                            <goals>
                                <goal>install</goal>
                            </goals>
                            <configuration>
                                <targetURL>http://${aem.host}:${aem.port}/crx/packmgr/service.jsp</targetURL>
                            </configuration>
                        </execution>
                    </executions>
                </plugin>
            </plugins>
        </build>
    </profile>
</profiles>

<!-- ====================================================================== -->
<!-- D E P E N D E N C I E S                                                -->
<!-- ====================================================================== -->
<dependencies>
    <dependency>
        <groupId>org.apache.servicemix.bundles</groupId>
        <artifactId>org.apache.servicemix.bundles.antlr</artifactId>
        <version>2.7.7_5</version>
    </dependency>
    <dependency>
        <groupId>com.fasterxml</groupId>
        <artifactId>classmate</artifactId>
        <version>1.3.4</version>
    </dependency>
    <dependency>
        <groupId>com.sun.activation</groupId>
        <artifactId>javax.activation</artifactId>
        <version>1.2.0</version>
    </dependency>
    <dependency>
        <groupId>javax.activation</groupId>
        <artifactId>javax.activation-api</artifactId>
        <version>1.2.0</version>
    </dependency>
    <dependency>
        <groupId>javax.persistence</groupId>
        <artifactId>javax.persistence-api</artifactId>
        <version>2.2</version>
    </dependency>
    <dependency>
        <groupId>javax.xml.bind</groupId>
        <artifactId>jaxb-api</artifactId>
        <version>2.3.1</version>
    </dependency>
    <dependency>
        <groupId>net.bytebuddy</groupId>
        <artifactId>byte-buddy</artifactId>
        <version>1.9.11</version>
    </dependency>
    <dependency>
        <groupId>org.apache.servicemix.bundles</groupId>
        <artifactId>org.apache.servicemix.bundles.dom4j</artifactId>
        <version>2.1.1_1</version>
    </dependency>
    <dependency>
        <groupId>com.sun.istack</groupId>
        <artifactId>istack-commons-runtime</artifactId>
        <version>3.0.7</version>
    </dependency>
    <dependency>
        <groupId>com.sun.xml.fastinfoset</groupId>
        <artifactId>FastInfoset</artifactId>
        <version>1.2.16</version>
    </dependency>
    <dependency>
        <groupId>org.apache.servicemix.bundles</groupId>
        <artifactId>org.apache.servicemix.bundles.jaxb-runtime</artifactId>
        <version>2.3.1_1</version>
    </dependency>
    <dependency>
        <groupId>org.javassist</groupId>
        <artifactId>javassist</artifactId>
        <version>3.24.0-GA</version>
    </dependency>
    <dependency>
        <groupId>org.jboss.logging</groupId>
        <artifactId>jboss-logging</artifactId>
        <version>3.3.2.Final</version>
    </dependency>
    <dependency>
        <groupId>org.hibernate.common</groupId>
        <artifactId>hibernate-commons-annotations</artifactId>
        <version>5.1.0.Final</version>
    </dependency>
    <dependency>
        <groupId>org.jboss</groupId>
        <artifactId>jandex</artifactId>
        <version>2.0.5.Final</version>
    </dependency>
    <dependency>
        <groupId>javax.el</groupId>
        <artifactId>javax.el-api</artifactId>
        <version>2.2.5</version>
    </dependency>
    <dependency>
        <groupId>org.apache.servicemix.bundles</groupId>
        <artifactId>org.apache.servicemix.bundles.javax-inject</artifactId>
        <version>1_2</version>
    </dependency>
    <dependency>
        <groupId>javax.interceptor</groupId>
        <artifactId>javax.interceptor-api</artifactId>
        <version>1.2.2</version>
    </dependency>
    <dependency>
        <groupId>javax.enterprise</groupId>
        <artifactId>cdi-api</artifactId>
        <version>1.2</version>
        <scope>provided</scope>
    </dependency>
    <dependency>
        <groupId>org.jboss.spec.javax.interceptor</groupId>
        <artifactId>jboss-interceptors-api_1.2_spec</artifactId>
        <version>1.0.1.Final</version>
    </dependency>
    <dependency>
        <groupId>org.jboss.spec.javax.transaction</groupId>
        <artifactId>jboss-transaction-api_1.2_spec</artifactId>
        <version>1.1.1.Final</version>
    </dependency>
    <dependency>
        <groupId>mysql</groupId>
        <artifactId>mysql-connector-java</artifactId>
        <version>5.1.46</version>
    </dependency>
    <dependency>
        <groupId>org.hibernate</groupId>
        <artifactId>hibernate-core</artifactId>
        <version>5.4.5.Final</version>
    </dependency>
    <dependency>
        <groupId>org.hibernate</groupId>
        <artifactId>hibernate-osgi</artifactId>
        <version>5.4.5.Final</version>
    </dependency>
    <dependency>
        <groupId>com.adobe.aem</groupId>
        <artifactId>uber-jar</artifactId>
        <classifier>apis</classifier>
    </dependency>
    <dependency>
        <groupId>javax.jcr</groupId>
        <artifactId>jcr</artifactId>
    </dependency>
</dependencies>
  1. 另一种方法-使用Java sling-maven-plugin调用的Maven Invoker API以预定义的顺序在AEM Felix控制台中一个接一个地安装所有Hibernate软件包。以下是Maven配置文件的示例。
<profiles>
    <profile>
        <id>installHibernate</id>
        <activation>
            <activeByDefault>false</activeByDefault>
        </activation>

        <dependencies>
            <dependency>
                <groupId>rg</groupId>
                <artifactId>com.softwerke.jpa.hibernate.bundles</artifactId>
                <version>1.0-SNAPSHOT</version>
                <scope>import</scope>
                <type>pom</type>
            </dependency>
        <build>
            <plugins>
                <plugin>
                    <groupId>org.apache.maven.plugins</groupId>
                    <artifactId>maven-dependency-plugin</artifactId>
                    <executions>
                        <execution>
                            <id>copy</id>
                            <phase>package</phase>
                            <goals>
                                <goal>copy-dependencies</goal>
                            </goals>
                            <configuration>
                                <outputDirectory>
                                    ${basedir}/src/main/content/jcr_root/apps/hibernate/install/
                                </outputDirectory>
                                <includeArtifactIds>
                                    org.apache.servicemix.bundles.antlr,
                                    classmate,
                                    javax.activation,
                                    javax.activation-api,
                                    javax.persistence-api,
                                    jaxb-api,
                                    byte-buddy,
                                    org.apache.servicemix.bundles.dom4j,
                                    istack-commons-runtime,
                                    FastInfoset,
                                    org.apache.servicemix.bundles.jaxb-runtime,
                                    javassist,
                                    jboss-logging,
                                    hibernate-commons-annotations,
                                    jandex,
                                    javax.el-api,
                                    org.apache.servicemix.bundles.javax-inject,
                                    javax.interceptor-api,
                                    cdi-api,
                                    jboss-interceptors-api_1.2_spec,
                                    jboss-transaction-api_1.2_spec,
                                    mysql-connector-java,
                                    hibernate-core,
                                    hibernate-osgi
                                </includeArtifactIds>
                            </configuration>
                        </execution>
                    </executions>
                </plugin>
                <plugin>
                    <groupId>org.codehaus.mojo</groupId>
                    <artifactId>exec-maven-plugin</artifactId>
                    <version>1.6.0</version>
                    <executions>
                        <execution>
                            <phase>install</phase>
                            <goals>
                                <goal>java</goal>
                            </goals>
                        </execution>
                    </executions>
                    <configuration>
                        <mainClass>com.softwerke.build.utils.HibernateInstaller</mainClass>
                        <classpathScope>compile</classpathScope>
                        <arguments>
                            <!-- Path to load Hibernate OSGi dependencies from -->
                            <argument>${basedir}/src/main/content/jcr_root/apps/hibernate/install</argument>
                            <!-- Path to XML file with a list of Hibernate bundles -->
                            <argument>${basedir}/src/main/content/META-INF/resources/hibernate-bundles.xml</argument>
                            <!-- User login to install bundle in AEM -->
                            <argument>${sling.user}</argument>
                            <!-- User password to install bundle in AEM -->
                            <argument>${sling.password}</argument>
                            <!-- Path to AEM Felix Console -->
                            <argument>http://${aem.host}:${aem.port}/system/console</argument>
                        </arguments>
                    </configuration>
                </plugin>
            </plugins>
        </build>
    </profile>
</profiles>

使用Maven Invoker API安装Hibernate软件包的Java代码:

public class HibernateInstaller {
    public static void main(String[] args) throws Exception {
        String bundleFolder,
               xmlFilePath,
               slingUser,
               slingPassword,
               url;
        if (args != null && args.length == 5) {
            bundleFolder = args[0];
            xmlFilePath = args[1];
            slingUser = args[2];
            slingPassword = args[3];
            url = args[4];
        } else {
            throw new Exception("Can't execute Hibernate install!\nPlease specify five arguments.");
        }

        StringBuilder mvnCmd = new StringBuilder();
        mvnCmd.append("org.apache.sling:sling-maven-plugin:2.4.2:install-file");
        mvnCmd.append(" -Dsling.user=" + slingUser);
        mvnCmd.append(" -Dsling.password=" + slingPassword);
        mvnCmd.append(" -Dsling.url=" + url);
        mvnCmd.append(" -Dsling.deploy.method=WebConsole");
        mvnCmd.append(" -Dsling.file=");
        mvnCmd.append(bundleFolder);
        mvnCmd.append("/");

        // Read XML file with a list of the Hibernate OSGi dependencies (bundles)
        File file = new File(xmlFilePath);
        DocumentBuilderFactory documentBuilderFactory = DocumentBuilderFactory.newInstance();
        DocumentBuilder documentBuilder = documentBuilderFactory.newDocumentBuilder();
        Document document = documentBuilder.parse(file);
        NodeList bundlesList = document.getElementsByTagName("bundle");

        final InvocationRequest invocationRequest = new DefaultInvocationRequest();
        // invocationRequest.setDebug(true);
        final Invoker invoker = new DefaultInvoker();

        for (int i = 0; i < bundlesList.getLength(); i++) {
            String goal = mvnCmd.toString() + bundlesList.item(i).getTextContent();
            installBundle(invocationRequest, invoker, goal);
        }
    }

    private static void installBundle(InvocationRequest invocationRequest, Invoker invoker, String goal)
            throws MavenInvocationException, CommandLineException {
        invocationRequest.setGoals(Collections.singletonList(goal));
        final InvocationResult invocationResult = invoker.execute(invocationRequest);
        if (invocationResult.getExitCode() != 0) {
            String msg = "Invocation Exception";
            if (invocationResult.getExecutionException() != null) {
                msg = invocationResult.getExecutionException().getMessage();
            }
            throw new CommandLineException(msg);
        }
    }
}

PS

  1. 如果您不需要对AEM实例具有相同依赖性的不同版本,最好避免使用OSGi <Embed-Transitive>true</Embed-Transitive>,因为它可能会引入安全性/性能/ OSGi问题-有关详细信息,请参见Embedding_Transitive_Dependencies_Into_a_Mega-Bundle_With_Maven-Bundle-Plugin
  2. 如果您曾经决定切换到另一个ORM框架,最好使用JPA EntityManagerFactory方法,而不要使用特定于Hibernate的SessionFactory-检查https://stackoverflow.com/a/5640796/12547140