mysql - 类未找到异常 : Cycle detected while trying to load class - at Entity Classes (When starting JPA bundle in Karaf)

标签 mysql osgi openjpa karaf aries

我的问题与启动仅限 jpa 的 bundle 时出现“尝试加载类时检测到循环”错误有关。

我已经使用 Maven 原型(prototype)创建了一个 JPA bundle ,并修改了其 pom.xml 以与 Karaf (4.0.1)、Aries Blueprint、 MySQL、OpenJPA、OpenJDK 1.8。使用 eclipse-tooling 生成的实体类也添加到 persistence.xml 中。

我能够编译它并将其安装在 Karaf 上,没有错误。启动 bundle 时出现错误。这些类在 Karaf 2.x(Geronimo 应用服务器)上运行良好。

我怀疑它可能与类中的 @OneToMany/@ManyToOne 带注释的字段有关,因为如果我只生成一个没有连接的类,则 bundle 会完美启动。我也尝试了 pax-jdbc-mysql 方式(不使用蓝图),但除了成功创建的 dataSource 之外,结果相同。我的类只有 jpa 注释。

bundle 结构如下:

bse.jpa\
   - src/main/java/mycustom-path/entities
   - src/main/resources/META-INF
       MANIFEST.MF
       persistence.xml
   - src/main/resources/OSGI-INF/blueprint
       datasource.xml

类定义示例:

@Entity
@Table(name="business_entities")
@NamedQuery(name="BusinessEntity.findAll", query="SELECT b FROM BusinessEntity b")
public class BusinessEntity implements Serializable {
    private static final long serialVersionUID = 1L;

    @Id
    @GeneratedValue(strategy=GenerationType.IDENTITY)
    @Column(unique=true, nullable=false)
    private Integer identity;

    @Column(length=1000)
    private String address;

    @Column(length=150)
    private String city;

    @Column(length=1000)
    private String comments;

    @Temporal(TemporalType.TIMESTAMP)
    @Column(name="date_created")
    private Date dateCreated;

    @Temporal(TemporalType.TIMESTAMP)
    @Column(name="date_updated")
    private Date dateUpdated;

    @Column(length=200)
    private String description;

    @Column(length=75)
    private String email;

    @Column(length=45)
    private String fax;

    private Integer idcompany;

    private Integer idcountry;

    private Integer iduser;

    @Column(name="iduser_updated")
    private Integer iduserUpdated;

    @Column(length=200)
    private String name;

    @Column(length=45)
    private String phone;

    @Column(length=45)
    private String postalcode;

    @Column(name="tax_id", length=20)
    private String taxId;

    @Column(length=500)
    private String website;

    //bi-directional many-to-one association to BusinessEntityContact
    @OneToMany(mappedBy="businessEntity")
    private List<BusinessEntityContact> businessEntityContacts;

    //bi-directional many-to-one association to CustomerExtInfo
    @OneToMany(mappedBy="businessEntity")
    private List<CustomerExtInfo> customerExtInfos;

    //bi-directional many-to-many association to EntityCategory
    @ManyToMany(mappedBy="businessEntities")
    private List<EntityCategory> entityCategories;

    //bi-directional many-to-one association to EntityAccount
    @OneToMany(mappedBy="businessEntity")
    private List<EntityAccount> entityAccounts;

    //bi-directional many-to-one association to ProviderExtInfo
    @OneToMany(mappedBy="businessEntity")
    private List<ProviderExtInfo> providerExtInfos;

    public BusinessEntity() {
    }

    public Integer getIdentity() {
        return this.identity;
    }

    public void setIdentity(Integer identity) {
        this.identity = identity;
    }

    public String getAddress() {
        return this.address;
    }

    public void setAddress(String address) {
        this.address = address;
    }

    public String getCity() {
        return this.city;
    }

    public void setCity(String city) {
        this.city = city;
    }

    public String getComments() {
        return this.comments;
    }

    public void setComments(String comments) {
        this.comments = comments;
    }

    public Date getDateCreated() {
        return this.dateCreated;
    }

    public void setDateCreated(Date dateCreated) {
        this.dateCreated = dateCreated;
    }

    public Date getDateUpdated() {
        return this.dateUpdated;
    }

    public void setDateUpdated(Date dateUpdated) {
        this.dateUpdated = dateUpdated;
    }

    public String getDescription() {
        return this.description;
    }

    public void setDescription(String description) {
        this.description = description;
    }

    public String getEmail() {
        return this.email;
    }

    public void setEmail(String email) {
        this.email = email;
    }

    public String getFax() {
        return this.fax;
    }

    public void setFax(String fax) {
        this.fax = fax;
    }

    public Integer getIdcompany() {
        return this.idcompany;
    }

    public void setIdcompany(Integer idcompany) {
        this.idcompany = idcompany;
    }

    public Integer getIdcountry() {
        return this.idcountry;
    }

    public void setIdcountry(Integer idcountry) {
        this.idcountry = idcountry;
    }

    public Integer getIduser() {
        return this.iduser;
    }

    public void setIduser(Integer iduser) {
        this.iduser = iduser;
    }

    public Integer getIduserUpdated() {
        return this.iduserUpdated;
    }

    public void setIduserUpdated(Integer iduserUpdated) {
        this.iduserUpdated = iduserUpdated;
    }

    public String getName() {
        return this.name;
    }

    public void setName(String name) {
        this.name = name;
    }

    public String getPhone() {
        return this.phone;
    }

    public void setPhone(String phone) {
        this.phone = phone;
    }

    public String getPostalcode() {
        return this.postalcode;
    }

    public void setPostalcode(String postalcode) {
        this.postalcode = postalcode;
    }

    public String getTaxId() {
        return this.taxId;
    }

    public void setTaxId(String taxId) {
        this.taxId = taxId;
    }

    public String getWebsite() {
        return this.website;
    }

    public void setWebsite(String website) {
        this.website = website;
    }

    public List<BusinessEntityContact> getBusinessEntityContacts() {
        return this.businessEntityContacts;
    }

    public void setBusinessEntityContacts(List<BusinessEntityContact> businessEntityContacts) {
        this.businessEntityContacts = businessEntityContacts;
    }

    public BusinessEntityContact addBusinessEntityContact(BusinessEntityContact businessEntityContact) {
        getBusinessEntityContacts().add(businessEntityContact);
        businessEntityContact.setBusinessEntity(this);

        return businessEntityContact;
    }

    public BusinessEntityContact removeBusinessEntityContact(BusinessEntityContact businessEntityContact) {
        getBusinessEntityContacts().remove(businessEntityContact);
        businessEntityContact.setBusinessEntity(null);

        return businessEntityContact;
    }

    public List<CustomerExtInfo> getCustomerExtInfos() {
        return this.customerExtInfos;
    }

    public void setCustomerExtInfos(List<CustomerExtInfo> customerExtInfos) {
        this.customerExtInfos = customerExtInfos;
    }

    public CustomerExtInfo addCustomerExtInfo(CustomerExtInfo customerExtInfo) {
        getCustomerExtInfos().add(customerExtInfo);
        customerExtInfo.setBusinessEntity(this);

        return customerExtInfo;
    }

    public CustomerExtInfo removeCustomerExtInfo(CustomerExtInfo customerExtInfo) {
        getCustomerExtInfos().remove(customerExtInfo);
        customerExtInfo.setBusinessEntity(null);

        return customerExtInfo;
    }

    public List<EntityCategory> getEntityCategories() {
        return this.entityCategories;
    }

    public void setEntityCategories(List<EntityCategory> entityCategories) {
        this.entityCategories = entityCategories;
    }

    public List<EntityAccount> getEntityAccounts() {
        return this.entityAccounts;
    }

    public void setEntityAccounts(List<EntityAccount> entityAccounts) {
        this.entityAccounts = entityAccounts;
    }

    public EntityAccount addEntityAccount(EntityAccount entityAccount) {
        getEntityAccounts().add(entityAccount);
        entityAccount.setBusinessEntity(this);

        return entityAccount;
    }

    public EntityAccount removeEntityAccount(EntityAccount entityAccount) {
        getEntityAccounts().remove(entityAccount);
        entityAccount.setBusinessEntity(null);

        return entityAccount;
    }

    public List<ProviderExtInfo> getProviderExtInfos() {
        return this.providerExtInfos;
    }

    public void setProviderExtInfos(List<ProviderExtInfo> providerExtInfos) {
        this.providerExtInfos = providerExtInfos;
    }

    public ProviderExtInfo addProviderExtInfo(ProviderExtInfo providerExtInfo) {
        getProviderExtInfos().add(providerExtInfo);
        providerExtInfo.setBusinessEntity(this);

        return providerExtInfo;
    }

    public ProviderExtInfo removeProviderExtInfo(ProviderExtInfo providerExtInfo) {
        getProviderExtInfos().remove(providerExtInfo);
        providerExtInfo.setBusinessEntity(null);

        return providerExtInfo;
    }

}

我得到的错误是:

2017-12-08 07:30:22,514 | ERROR | lixDispatchQueue | container                        | 108 - org.apache.aries.jpa.container - 2.6.1 | FrameworkEvent ERROR - org.apache.aries.jpa.container
org.osgi.framework.hooks.weaving.WeavingException: Weaving failure on class cbn.bse.jpa.persistence.entities.EntityAccount in bundle bse.jpa/1.0.0.SNAPSHOT using transformer org.apache.openjpa.persistence.PersistenceProviderImpl$ClassTransformerImpl@4d3cfedd
    at org.apache.aries.jpa.container.weaving.impl.JPAWeavingHook.transformClass(JPAWeavingHook.java:101)[108:org.apache.aries.jpa.container:2.6.1]
    at org.apache.aries.jpa.container.weaving.impl.JPAWeavingHook.weave(JPAWeavingHook.java:65)[108:org.apache.aries.jpa.container:2.6.1]
    at org.apache.felix.framework.util.SecureAction.invokeWeavingHook(SecureAction.java:1203)[org.apache.felix.framework-5.6.4.jar:]
    at org.apache.felix.framework.BundleWiringImpl$BundleClassLoader.transformClass(BundleWiringImpl.java:2370)[org.apache.felix.framework-5.6.4.jar:]
    at org.apache.felix.framework.BundleWiringImpl$BundleClassLoader.findClass(BundleWiringImpl.java:2057)[org.apache.felix.framework-5.6.4.jar:]
    at org.apache.felix.framework.BundleWiringImpl.findClassOrResourceByDelegation(BundleWiringImpl.java:1518)[org.apache.felix.framework-5.6.4.jar:]
    at org.apache.felix.framework.BundleWiringImpl.access$200(BundleWiringImpl.java:79)[org.apache.felix.framework-5.6.4.jar:]
    at org.apache.felix.framework.BundleWiringImpl$BundleClassLoader.loadClass(BundleWiringImpl.java:1958)[org.apache.felix.framework-5.6.4.jar:]
    at java.lang.ClassLoader.loadClass(ClassLoader.java:357)[:1.8.0_151]
    at java.lang.Class.forName0(Native Method)[:1.8.0_151]
    at java.lang.Class.forName(Class.java:348)[:1.8.0_151]
    at org.apache.openjpa.meta.MetaDataRepository.classForName(MetaDataRepository.java:1559)[165:org.apache.openjpa:2.4.1]
    at org.apache.openjpa.meta.MetaDataRepository.loadPersistentTypesInternal(MetaDataRepository.java:1535)[165:org.apache.openjpa:2.4.1]
    at org.apache.openjpa.meta.MetaDataRepository.loadPersistentTypes(MetaDataRepository.java:1513)[165:org.apache.openjpa:2.4.1]
    at org.apache.openjpa.kernel.AbstractBrokerFactory.loadPersistentTypes(AbstractBrokerFactory.java:279)[165:org.apache.openjpa:2.4.1]
    at org.apache.openjpa.kernel.AbstractBrokerFactory.initializeBroker(AbstractBrokerFactory.java:235)[165:org.apache.openjpa:2.4.1]
    at org.apache.openjpa.kernel.AbstractBrokerFactory.newBroker(AbstractBrokerFactory.java:211)[165:org.apache.openjpa:2.4.1]
    at org.apache.openjpa.kernel.DelegatingBrokerFactory.newBroker(DelegatingBrokerFactory.java:154)[165:org.apache.openjpa:2.4.1]
    at org.apache.openjpa.persistence.EntityManagerFactoryImpl.createEntityManager(EntityManagerFactoryImpl.java:226)[165:org.apache.openjpa:2.4.1]
    at org.apache.openjpa.persistence.EntityManagerFactoryImpl.createEntityManager(EntityManagerFactoryImpl.java:153)[165:org.apache.openjpa:2.4.1]
    at org.apache.openjpa.persistence.EntityManagerFactoryImpl.getProperties(EntityManagerFactoryImpl.java:108)[165:org.apache.openjpa:2.4.1]
    at org.apache.aries.jpa.support.osgi.impl.EMFTracker.getTransactionType(EMFTracker.java:96)[109:org.apache.aries.jpa.support:2.6.1]
    at org.apache.aries.jpa.support.osgi.impl.EMFTracker.addingService(EMFTracker.java:78)[109:org.apache.aries.jpa.support:2.6.1]
    at org.osgi.util.tracker.ServiceTracker$Tracked.customizerAdding(ServiceTracker.java:941)[org.osgi.core-6.0.0.jar:]
    at org.osgi.util.tracker.ServiceTracker$Tracked.customizerAdding(ServiceTracker.java:870)[org.osgi.core-6.0.0.jar:]
    at org.osgi.util.tracker.AbstractTracked.trackAdding(AbstractTracked.java:256)[org.osgi.core-6.0.0.jar:]
    at org.osgi.util.tracker.AbstractTracked.track(AbstractTracked.java:229)[org.osgi.core-6.0.0.jar:]
    at org.osgi.util.tracker.ServiceTracker$Tracked.serviceChanged(ServiceTracker.java:901)[org.osgi.core-6.0.0.jar:]
    at org.apache.felix.framework.EventDispatcher.invokeServiceListenerCallback(EventDispatcher.java:990)[org.apache.felix.framework-5.6.4.jar:]
    at org.apache.felix.framework.EventDispatcher.fireEventImmediately(EventDispatcher.java:838)[org.apache.felix.framework-5.6.4.jar:]
    at org.apache.felix.framework.EventDispatcher.fireServiceEvent(EventDispatcher.java:545)[org.apache.felix.framework-5.6.4.jar:]
    at org.apache.felix.framework.Felix.fireServiceEvent(Felix.java:4579)[org.apache.felix.framework-5.6.4.jar:]
    at org.apache.felix.framework.Felix.registerService(Felix.java:3571)[org.apache.felix.framework-5.6.4.jar:]
    at org.apache.felix.framework.BundleContextImpl.registerService(BundleContextImpl.java:348)[org.apache.felix.framework-5.6.4.jar:]
    at org.apache.felix.framework.BundleContextImpl.registerService(BundleContextImpl.java:355)[org.apache.felix.framework-5.6.4.jar:]
    at org.apache.aries.jpa.container.impl.ManagedEMF.createAndPublishEMF(ManagedEMF.java:132)[108:org.apache.aries.jpa.container:2.6.1]
    at org.apache.aries.jpa.container.impl.ManagedEMF.updated(ManagedEMF.java:125)[108:org.apache.aries.jpa.container:2.6.1]
    at org.apache.felix.cm.impl.helper.ManagedServiceTracker.updated(ManagedServiceTracker.java:189)[3:org.apache.felix.configadmin:1.8.14]
    at org.apache.felix.cm.impl.helper.ManagedServiceTracker.updateService(ManagedServiceTracker.java:152)[3:org.apache.felix.configadmin:1.8.14]
    at org.apache.felix.cm.impl.helper.ManagedServiceTracker.provideConfiguration(ManagedServiceTracker.java:85)[3:org.apache.felix.configadmin:1.8.14]
    at org.apache.felix.cm.impl.ConfigurationManager$ManagedServiceUpdate.provide(ConfigurationManager.java:1463)[3:org.apache.felix.configadmin:1.8.14]
    at org.apache.felix.cm.impl.ConfigurationManager$ManagedServiceUpdate.run(ConfigurationManager.java:1419)[3:org.apache.felix.configadmin:1.8.14]
    at org.apache.felix.cm.impl.UpdateThread.run0(UpdateThread.java:141)[3:org.apache.felix.configadmin:1.8.14]
    at org.apache.felix.cm.impl.UpdateThread.run(UpdateThread.java:109)[3:org.apache.felix.configadmin:1.8.14]
    at java.lang.Thread.run(Thread.java:748)[:1.8.0_151]
Caused by: <openjpa-2.4.1-r422266:1730418 nonfatal general error> org.apache.openjpa.util.GeneralException: cbn/bse/jpa/persistence/entities/EntityAccount
    at org.apache.openjpa.enhance.PCClassFileTransformer.transform0(PCClassFileTransformer.java:172)
    at org.apache.openjpa.enhance.PCClassFileTransformer.transform(PCClassFileTransformer.java:128)
    at org.apache.openjpa.persistence.PersistenceProviderImpl$ClassTransformerImpl.transform(PersistenceProviderImpl.java:292)
    at org.apache.aries.jpa.container.weaving.impl.JPAWeavingHook.transformClass(JPAWeavingHook.java:86)[108:org.apache.aries.jpa.container:2.6.1]
    ... 44 more
Caused by: java.lang.NoClassDefFoundError: cbn/bse/jpa/persistence/entities/EntityAccount
    at java.lang.Class.getDeclaredMethods0(Native Method)[:1.8.0_151]
    at java.lang.Class.privateGetDeclaredMethods(Class.java:2701)[:1.8.0_151]
    at java.lang.Class.getDeclaredMethods(Class.java:1975)[:1.8.0_151]
    at org.apache.openjpa.lib.util.J2DoPrivHelper$9.run(J2DoPrivHelper.java:334)
    at org.apache.openjpa.lib.util.J2DoPrivHelper$9.run(J2DoPrivHelper.java:332)
    at java.security.AccessController.doPrivileged(Native Method)[:1.8.0_151]
    at org.apache.openjpa.persistence.PersistenceMetaDataDefaults.determineImplicitAccessType(PersistenceMetaDataDefaults.java:366)
    at org.apache.openjpa.persistence.PersistenceMetaDataDefaults.determineAccessType(PersistenceMetaDataDefaults.java:332)
    at org.apache.openjpa.persistence.PersistenceMetaDataDefaults.populate(PersistenceMetaDataDefaults.java:274)
    at org.apache.openjpa.meta.MetaDataRepository.addMetaData(MetaDataRepository.java:921)
    at org.apache.openjpa.meta.MetaDataRepository.addMetaData(MetaDataRepository.java:906)
    at org.apache.openjpa.persistence.AnnotationPersistenceMetaDataParser.getMetaData(AnnotationPersistenceMetaDataParser.java:756)
    at org.apache.openjpa.persistence.AnnotationPersistenceMetaDataParser.parseClassAnnotations(AnnotationPersistenceMetaDataParser.java:544)
    at org.apache.openjpa.persistence.AnnotationPersistenceMetaDataParser.parse(AnnotationPersistenceMetaDataParser.java:414)
    at org.apache.openjpa.persistence.PersistenceMetaDataFactory.load(PersistenceMetaDataFactory.java:259)
    at org.apache.openjpa.meta.MetaDataRepository.getMetaDataInternal(MetaDataRepository.java:587)
    at org.apache.openjpa.meta.MetaDataRepository.getMetaDataInternal(MetaDataRepository.java:397)
    at org.apache.openjpa.meta.MetaDataRepository.getMetaData(MetaDataRepository.java:389)
    at org.apache.openjpa.meta.ValueMetaDataImpl.resolveDeclaredType(ValueMetaDataImpl.java:487)
    at org.apache.openjpa.meta.ValueMetaDataImpl.resolve(ValueMetaDataImpl.java:466)
    at org.apache.openjpa.meta.FieldMetaData.resolve(FieldMetaData.java:1883)
    at org.apache.openjpa.meta.ClassMetaData.resolveMeta(ClassMetaData.java:1874)
    at org.apache.openjpa.meta.ClassMetaData.resolve(ClassMetaData.java:1808)
    at org.apache.openjpa.meta.MetaDataRepository.processBuffer(MetaDataRepository.java:829)
    at org.apache.openjpa.meta.MetaDataRepository.resolveMeta(MetaDataRepository.java:726)
    at org.apache.openjpa.meta.MetaDataRepository.resolve(MetaDataRepository.java:650)
    at org.apache.openjpa.meta.MetaDataRepository.getMetaDataInternal(MetaDataRepository.java:418)
    at org.apache.openjpa.meta.MetaDataRepository.getMetaData(MetaDataRepository.java:389)
    at org.apache.openjpa.enhance.PCEnhancer.<init>(PCEnhancer.java:286)
    at org.apache.openjpa.enhance.PCEnhancer.<init>(PCEnhancer.java:257)
    at org.apache.openjpa.enhance.PCClassFileTransformer.transform0(PCClassFileTransformer.java:151)
    ... 47 more
Caused by: java.lang.ClassNotFoundException: Cycle detected while trying to load class: cbn.bse.jpa.persistence.entities.EntityAccount
    at org.apache.felix.framework.BundleWiringImpl$BundleClassLoader.loadClass(BundleWiringImpl.java:1980)[org.apache.felix.framework-5.6.4.jar:]
    at java.lang.ClassLoader.loadClass(ClassLoader.java:357)[:1.8.0_151]
    ... 78 more

我使用的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>
    <artifactId>bse.persistence</artifactId>
    <groupId>bse.persistence</groupId>
    <version>1.0.0-SNAPSHOT</version>
  </parent>

    <groupId>bse.jpa</groupId>
    <artifactId>bse.jpa</artifactId>
    <packaging>bundle</packaging>

    <name>bse.jpa Bundle</name>
    <description>bse.jpa OSGi bundle project.</description>

    <properties>
        <maven-bundle-plugin.version>3.3.0</maven-bundle-plugin.version>
        <osgi.version>5.0.0</osgi.version>
    </properties>

    <dependencies>
        <dependency>
            <groupId>org.osgi</groupId>
            <artifactId>org.osgi.core</artifactId>
            <version>${osgi.version}</version>
            <scope>provided</scope>
        </dependency>
        <dependency>
            <groupId>org.osgi</groupId>
            <artifactId>osgi.cmpn</artifactId>
            <version>${osgi.version}</version>
        </dependency>
        <dependency>
            <groupId>org.osgi</groupId>
            <artifactId>osgi.enterprise</artifactId>
            <version>${osgi.version}</version>
        </dependency>
        <dependency>
            <groupId>org.apache.openjpa</groupId>
            <artifactId>openjpa</artifactId>
            <version>2.4.1</version>
            <type>bundle</type>
        </dependency>
        <dependency>
            <groupId>javax.annotation</groupId>
            <artifactId>javax.annotation-api</artifactId>
            <version>1.3.1</version>
        </dependency>
        <dependency>
            <groupId>mysql</groupId>
            <artifactId>mysql-connector-java</artifactId>
            <version>5.1.34</version>
        </dependency>
        <dependency>
            <groupId>org.apache.geronimo.specs</groupId>
            <artifactId>geronimo-jpa_2.0_spec</artifactId>
            <version>1.1</version>
            <type>bundle</type>
        </dependency>

    </dependencies>

    <build>
        <resources>
            <resource>
                <directory>src/main/java</directory>
                <excludes>
                  <exclude>**/*.java</exclude>
                </excludes>
            </resource>
            <resource>
                <directory>src/main/resources</directory>           
            </resource>         
        </resources>
        <pluginManagement>
            <plugins>
                <plugin>
                    <groupId>org.apache.felix</groupId>
                    <artifactId>maven-bundle-plugin</artifactId>
                    <version>${maven-bundle-plugin.version}</version>
                    <extensions>true</extensions>
                    <configuration>
                        <archive>
                            <manifestEntries>
                                <Meta-Persistence>META-INF/persistence.xml</Meta-Persistence>
                                <Bundle-Blueprint>OSGI-INF/blueprint/*.xml</Bundle-Blueprint>
                            </manifestEntries>
                        </archive>                  
                        <manifestLocation>src/main/resources/META-INF</manifestLocation>
                        <rebuildBundle>true</rebuildBundle>
                        <instructions>
                            <Bundle-SymbolicName>${project.artifactId}</Bundle-SymbolicName>
                            <Bundle-Version>${project.version}</Bundle-Version>
                            <Bundle-Activator>bse.jpa.Activator</Bundle-Activator>
                            <Import-Package>com.mysql.jdbc.jdbc2.optional,
                                javax.sql, 
                                javax.persistence;version=2.0, 
                                javax.persistence.metamodel,
                                javax.transaction,
                                javax.transaction.xa,                       
                                org.osgi.framework</Import-Package>
                            <Export-Package>cbn.bse.jpa.persistence.entities,
                                bse.jpa
                            </Export-Package>                           
                            <Meta-Persistence>META-INF/persistence.xml</Meta-Persistence>
                            <Bundle-ManifestVersion>2</Bundle-ManifestVersion>
                            <Include-Resource>src/main/resources</Include-Resource>
                            <Bundle-Blueprint>OSGI-INF/blueprint/*.xml</Bundle-Blueprint>

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

                <plugin>
                    <groupId>org.apache.openjpa</groupId>
                    <artifactId>openjpa-maven-plugin</artifactId>
                    <version>2.4.1</version>

                    <configuration>
                      <includes>cbn/bse/jpa/persistence/entities/**/*.class</includes>
                    </configuration>                

                    <executions>
                      <execution>
                        <id>enhancer</id>
                        <phase>process-classes</phase>
                        <goals>
                          <goal>enhance</goal>
                        </goals>
                      </execution>
                    </executions>
                    <dependencies>
                        <dependency>
                            <groupId>org.apache.openjpa</groupId>
                            <artifactId>openjpa</artifactId>
                            <version>2.4.1</version>
                        </dependency>
                    </dependencies>             
                </plugin>

                <plugin>
                   <artifactId>maven-assembly-plugin</artifactId>
                   <executions>
                     <execution>
                       <goals>
                         <goal>assembly</goal>
                       </goals>
                     </execution>
                   </executions>
                </plugin>               

            </plugins>
        </pluginManagement>
    </build>
</project>

蓝图文件:

<?xml version="1.0" encoding="UTF-8"?>
<blueprint xmlns="http://www.osgi.org/xmlns/blueprint/v1.0.0">

    <bean class="com.mysql.jdbc.jdbc2.optional.MysqlDataSource" id="sssDataSource" >
        <property name="serverName" value="localhost"></property>
        <property name="databaseName" value="rrrr"></property>
        <property name="port" value="3306"></property>
        <property name="user" value="yyyy"></property>
        <property name="password" value="xxxxx"></property>
    </bean>

    <!-- javax.sql.DataSource -->
    <service id="bseDSService" interface="javax.sql.DataSource" ref="sssDataSource">
        <service-properties>
            <entry key="osgi.jndi.service.name" value="jdbc/rrrr" />
        </service-properties>
    </service>

</blueprint>

提前致谢!!

最佳答案

我喜欢一个解决方案,这不是修复,而是替代方案。我决定使用 EclipseLink 2.6.4(使用 persistence 2.1),并且对 pom.xml 和 persistence.xml 进行一些小的更改,我就能够启动我的包了。 考虑到我仍在使用 Karaf 4.1 (Apache Felix) 和 Aries(JPA 和 Blueprint),我相信问题可能与我不再使用此 bundle 的库有关:OpenJPA(最有可能)或 Geronimo JPA( JSR-317)。

我很抱歉现在没有更多的时间来使用 OpenJPA 来解决这个问题,但我很快就会解决这个问题。我希望这个解决方案可以帮助其他遇到同样问题的人。

这是我当前的 pom.xml(我添加了 Jackson 的库依赖项,因为我在服务中执行了一些 JSON 转换,您可能不需要):

<?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>
    <artifactId>xxx.persistence</artifactId>
    <groupId>bse.persistence</groupId>
    <version>1.0.0-SNAPSHOT</version>
  </parent>

    <groupId>bse.jpa</groupId>
    <artifactId>zzz.yyy</artifactId>
    <packaging>bundle</packaging>

    <name>bse.jpa Bundle</name>
    <description>zzz.yyy OSGi bundle project.</description>

    <properties>
        <maven-bundle-plugin.version>3.3.0</maven-bundle-plugin.version>
        <osgi.version>6.0.0</osgi.version>
    </properties>

    <dependencies>

        <dependency>
            <groupId>org.osgi</groupId>
            <artifactId>org.osgi.core</artifactId>
            <version>${osgi.version}</version>
            <scope>provided</scope>
        </dependency>
        <dependency>
            <groupId>org.osgi</groupId>
            <artifactId>osgi.cmpn</artifactId>
            <version>${osgi.version}</version>
        </dependency>
        <dependency>
            <groupId>org.osgi</groupId>
            <artifactId>osgi.enterprise</artifactId>
            <version>${osgi.version}</version>
        </dependency>

        <dependency>
            <groupId>mysql</groupId>
            <artifactId>mysql-connector-java</artifactId>
            <version>5.1.34</version>
        </dependency>
        <dependency>
            <groupId>javax.annotation</groupId>
            <artifactId>javax.annotation-api</artifactId>
            <version>1.3.1</version>
        </dependency>
        <dependency>
            <groupId>commons-collections</groupId>
            <artifactId>commons-collections</artifactId>
            <version>3.2.2</version>
        </dependency>
        <dependency>
            <groupId>commons-lang</groupId>
            <artifactId>commons-lang</artifactId>
            <version>2.6</version>
        </dependency>


        <dependency>
            <groupId>com.fasterxml.jackson.core</groupId>
            <artifactId>jackson-annotations</artifactId>
            <version>2.8.7</version>
            <type>bundle</type>
        </dependency>
        <dependency>
            <groupId>com.fasterxml.jackson.core</groupId>
            <artifactId>jackson-core</artifactId>
            <version>2.8.7</version>
            <type>bundle</type>
        </dependency>

        <dependency>
            <groupId>org.eclipse.persistence</groupId>
            <artifactId>javax.persistence</artifactId>
            <version>2.1.0</version>
        </dependency>
        <dependency>
            <groupId>org.eclipse.persistence</groupId>
            <artifactId>eclipselink</artifactId>
            <version>2.6.4</version>
        </dependency>
        <dependency>
            <groupId>org.eclipse.persistence</groupId>
            <artifactId>org.eclipse.persistence.antlr</artifactId>
            <version>2.6.4</version>
        </dependency>
        <dependency>
            <groupId>org.eclipse.persistence</groupId>
            <artifactId>org.eclipse.persistence.asm</artifactId>
            <version>2.6.4</version>
        </dependency>
        <dependency>
            <groupId>org.eclipse.persistence</groupId>
            <artifactId>org.eclipse.persistence.jpa.jpql</artifactId>
            <version>2.6.4</version>
        </dependency>
        <dependency>
            <groupId>org.eclipse.persistence</groupId>
            <artifactId>org.eclipse.persistence.core</artifactId>
            <version>2.6.4</version>
        </dependency>
        <dependency>
            <groupId>org.eclipse.persistence</groupId>
            <artifactId>org.eclipse.persistence.jpa</artifactId>
            <version>2.6.4</version>
        </dependency>
        <dependency>
            <groupId>org.eclipse.persistence</groupId>
            <artifactId>
                org.eclipse.persistence.jpa.modelgen.processor
            </artifactId>
            <version>2.6.4</version>
        </dependency>
    </dependencies>

    <build>
        <resources>
            <resource>
                <directory>src/main/java</directory>
                <excludes>
                  <exclude>**/*.java</exclude>
                </excludes>
            </resource>
            <resource>
                <directory>src/main/resources</directory>           
            </resource>         
        </resources>
        <pluginManagement>
            <plugins>
                <plugin>
                    <groupId>org.apache.felix</groupId>
                    <artifactId>maven-bundle-plugin</artifactId>
                    <version>${maven-bundle-plugin.version}</version>
                    <extensions>true</extensions>
                    <configuration>
                        <archive>
                            <manifestEntries>
                                <Meta-Persistence>META-INF/persistence.xml</Meta-Persistence>
                                <Bundle-Blueprint>OSGI-INF/blueprint/*.xml</Bundle-Blueprint>
                            </manifestEntries>
                        </archive>                  
                        <manifestLocation>src/main/resources/META-INF</manifestLocation>
                        <rebuildBundle>true</rebuildBundle>
                        <instructions>
                            <Bundle-SymbolicName>${project.artifactId}</Bundle-SymbolicName>
                            <Bundle-Version>${project.version}</Bundle-Version>
                            <Bundle-Activator>bse.jpa.Activator</Bundle-Activator>
                            <Import-Package>com.mysql.jdbc.jdbc2.optional,
                                org.apache.felix.service.command,
                                org.apache.karaf.shell.commands,
                                org.apache.karaf.shell.console,
                                org.eclipse.persistence.internal.weaving,
                                org.eclipse.persistence.internal.descriptors,
                                org.eclipse.persistence.queries,
                                org.eclipse.persistence.descriptors.changetracking,
                                org.eclipse.persistence.internal.identitymaps,
                                org.eclipse.persistence.sessions,
                                org.eclipse.persistence.internal.jpa.rs.metadata.model,
                                org.eclipse.persistence.indirection,                            
                                javax.sql, 
                                javax.persistence;version=2.0, 
                                javax.persistence.metamodel,
                                javax.transaction,
                                javax.transaction.xa,                       
                                org.osgi.framework,
                                org.osgi.util.tracker,
                                *</Import-Package>
                            <Export-Package>cbn.bse.jpa.persistence.entities,
                                bse.jpa
                            </Export-Package>                           
                            <Meta-Persistence>META-INF/persistence.xml</Meta-Persistence>
                            <Bundle-ManifestVersion>2</Bundle-ManifestVersion>
                            <Include-Resource>src/main/resources</Include-Resource>
                            <Bundle-Blueprint>OSGI-INF/blueprint/*.xml</Bundle-Blueprint>

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

                <plugin>
                    <groupId>org.bsc.maven</groupId>
                    <artifactId>maven-processor-plugin</artifactId>
                    <version>2.2.4</version>
                    <executions>
                        <execution>
                            <id>eclipselink-jpa-metamodel</id>
                            <goals>
                                <goal>process</goal>
                            </goals>
                            <phase>generate-sources</phase>
                            <configuration>
                                <processors>
                                    <processor>org.eclipse.persistence.internal.jpa.modelgen.CanonicalModelProcessor</processor>
                                </processors>
                                <compilerArguments>-Aeclipselink.persistencexml=${basedir}/src/test/resources/META-INF/persistence.xml</compilerArguments>
                                <outputDirectory>${project.build.directory}/generated-sources</outputDirectory>
                            </configuration>
                        </execution>
                    </executions>
                    <dependencies>
                        <dependency>
                            <groupId>org.eclipse.persistence</groupId>
                            <artifactId>org.eclipse.persistence.jpa.modelgen.processor
                             </artifactId>
                            <version>2.6.4</version>
                        </dependency>
                    </dependencies>
                </plugin>

                <plugin>
                   <artifactId>maven-assembly-plugin</artifactId>
                   <executions>
                     <execution>
                       <goals>
                         <goal>assembly</goal>
                       </goals>
                     </execution>
                   </executions>
                </plugin>               

            </plugins>
        </pluginManagement>
    </build>
</project>

持久性(您可以轻松地将其更改为使用带有 pax-jdbc-mysql 的 JTA):

<?xml version="1.0" encoding="UTF-8"?>
<persistence version="2.1" 
             xmlns="http://xmlns.jcp.org/xml/ns/persistence"
             xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" 
             xsi:schemaLocation="http://xmlns.jcp.org/xml/ns/persistence http://xmlns.jcp.org/xml/ns/persistence/persistence_2_1.xsd">
    <persistence-unit name="rrrr" transaction-type="RESOURCE_LOCAL">
        <provider>org.eclipse.persistence.jpa.PersistenceProvider</provider>
        <non-jta-data-source>osgi:service/javax.sql.DataSource/(osgi.jndi.service.name=jdbc/rrrr)</non-jta-data-source>
        <class>Account</class>
        <class>Warehouse</class>
        <class>Widget</class>
        <exclude-unlisted-classes>true</exclude-unlisted-classes>
        <properties>
            <property name="eclipselink.logging.level"                      value="WARNING"/>
            <property name="eclipselink.logging.level.sql"                  value="WARNING"/>
            <property name="eclipselink.logging.parameters"                 value="true"/>
            <property name="eclipselink.logging.timestamp"                  value="true"/>
            <property name="eclipselink.logging.session"                    value="true"/>
            <property name="eclipselink.logging.thread"                     value="true"/>
            <property name="eclipselink.logging.exceptions"                 value="true"/>
            <property name="eclipselink.session.include.descriptor.queries" value="true"/>
            <property name="eclipselink.weaving"                            value="true"/>

        </properties>
    </persistence-unit>
</persistence>

有用的引用:

Luca Burgazzoli's Karaf examples (jpa)

Travis Steel's EclipseLink JPA Metamodel Generation in Eclipse with Maven

关于mysql - 类未找到异常 : Cycle detected while trying to load class - at Entity Classes (When starting JPA bundle in Karaf),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/47718617/

相关文章:

c# - 在 MYSQL 中插入 TIMESTAMP 数据?错误 "MYSQL version for the right syntax to use near etc"

mysql - org.apache.openjpa.lib.jdbc.ReportingSQLException、MySQL、OpenJPA、Geronimo

java - persistence.xml 事务类型 ="JTA"

mysql - 谁能告诉我为什么专家在 mySql 查询中使用\''

mysql - Rails 和 MySql 日期时间行为

mysql - 如何获取行

java - CQ5 OSGi bundle 未启动 :- Activator cannot be found

osgi - 无法启动片段包 : initial@reference:file:com. springsource.org.apache.jasper-6.0.18.jar

java - 使用 Oracle Java 8 JRE 172 打开 JCEKS keystore 时出现 "java.io.IOException: Invalid secret key format"

java.lang.IllegalStateException : No JTA UserTransaction available