Hello,
I generated a bundle of my JPA project with the OpenJPA lib content to
deploy it in dropins/ (I was already doing that before you mentionned it
:P) but, when I call the wanted class, I have a NoClassDefFoundError:
[2017-05-09 14:34:05,577] [] ERROR - NativeWorkerPool Uncaught exception
java.lang.NoClassDefFoundError:my/little/project/jpa/EntityManagerUtil
To me, that seems logic because the Maven Eclipse plugin generates a
directive uses="javax.persistence" for the this package. Something like:
Export-Package: my.little.project.jpa;uses:="javax.persistence";version="1
.0.0", <OTHER_THINGS_HERE>
So, just to try (even if we should not do this at home), I removed this
directive, that started very well by logging the OpenJPA parameters like:
164 my-pu INFO [PassThroughMessageProcessor-1] openjpa.Runtime -
Starting OpenJPA 2.4.2
CacheRetrieveMode = USE
CacheStoreMode = USE
EagerFetchMode = PARALLEL
ExtendedPathLookup = false
FetchBatchSize = -1
FetchDirection = FORWARD
Hints = {}
IgnoreDfgForFkSelect = false
Isolation = DEFAULT
JoinSyntax = DATABASE
LRSSize = 2
LRSSizeAlgorithm = QUERY
LockScope = NORMAL
LockTimeout = 0
MaxFetchDepth = -1
Blah blah blah yadda yadda yadda during many lines
But... then... BOOM:
[2017-05-09 14:43:58,636] [] ERROR - NativeWorkerPool Uncaught exception
java.lang.LinkageError: loader constraint violation: loader (instance of
org/apache/axis2/classloader/JarFileClassLoader
) previously initiated loading for a different type with name
"javax/persistence/EntityManager"
Then, again, it is logic because we have a little conflict in the air that
OSGi was trying to prevent by setting the directory. And that made me
think: How can I import my.little.project.jpa package in my connector if
the content META-INF is not read during its invocation? I mean, the
connector does not have its own classpath so how can I tell OSGi that I
want to import the cutty little package in this specific classpath? I think
I am screwed, here. OSGi got me. :D
Regards,
Thomas
2017-05-09 10:58 GMT+02:00 KasunG Gajasinghe <[email protected]>:
>
> The osgi bundle needs to be placed directly in the dropins/ folder. Sorry
> I missed to tell you that.
>
> I still think this is a classloading issue. One thing you can try is
> including the openjpa classes and resources within your osgi bundle itself.
> Or, make your bundle a fragment of openjpa. See [1]
>
> [1] https://www.eclipse.org/gemini/blueprint/
> documentation/reference/2.0.0.RELEASE/html/appendix-tips.html
>
> On Tue, May 9, 2017 at 1:45 PM, Thomas LEGRAND <
> [email protected]> wrote:
>
>> Hello KasunG,
>>
>> OK. I generated the osgi bundle for OpenJPA with the following POM
>> 'plugin configuration':
>>
>> <build>
>> <plugins>
>> <plugin>
>> <groupId>org.apache.felix</groupId>
>> <artifactId>maven-bundle-plugin</artifactId>
>> <version>2.3.7</version>
>> <extensions>true</extensions>
>> <configuration>
>> <instructions>
>> <Bundle-SymbolicName>${project.artifactId}</Bundle-SymbolicName>
>> <Bundle-Name>${project.artifactId}</Bundle-Name>
>> <Export-Package>javax.*, org.apache.openjpa.*</Export-Package>
>> <Private-Package>serp.*</Private-Package>
>> <Include-Resource>@openjpa-all-${version.openjpa}.jar!/META-INF/*,
>> @openjpa-all-${version.openjpa}.jar!/templates/*,
>> @openjpa-all-${version.openjpa}.jar!/testpool.jocl
>> </Include-Resource>
>> <Import-Package>com.ibm.*;resolution:=optional</Import-Package>
>> <DynamicImport-Package>*</DynamicImport-Package>
>> </instructions>
>> </configuration>
>> </plugin>
>> </plugins>
>> </build>
>>
>> But now, I am back to the initial error which occured when I just
>> included OpenJPA in the lib/ directory of the connector:
>>
>> <openjpa-2.4.2-r422266:1777108 fatal user error>
>> org.apache.openjpa.persistence.ArgumentException: The persistence
>> provider is attempting to use properties in the persistence.xml file to
>> resolve the data source. A Java Database Connectivity (JDBC) driver or data
>> source class name must be specified in the openjpa.ConnectionDriverName or
>> javax.persistence.jdbc.driver property. The following properties are
>> available in the configuration: "org.apache.openjpa.jdbc.conf.
>> JDBCConfigurationImpl@2655aabb".
>>
>> So, I think this is because the persistence.xml in not detected in the
>> META-INF of my OSGI JPA project. Here is the buil and dependencies
>> configuration in the POM:
>>
>> <build>
>> <plugins>
>> <plugin>
>> <groupId>org.apache.felix</groupId>
>> <artifactId>maven-bundle-plugin</artifactId>
>> <version>2.3.7</version>
>> <extensions>true</extensions>
>> <configuration>
>> <instructions>
>> <Meta-Persistence>/META-INF/persistence.xml</Meta-Persistence>
>> <Bundle-SymbolicName>${project.artifactId}</Bundle-SymbolicName>
>> <Bundle-Name>${project.artifactId}</Bundle-Name>
>> <Import-Package>org.apache.openjpa.*, javax.persistence</Import-Package>
>> <!-- <Include-Resource>META-INF/persistence.xml</Include-Resource> -->
>> <DynamicImport-Package>*</DynamicImport-Package>
>> </instructions>
>> </configuration>
>> </plugin>
>> </plugins>
>> </build>
>> <dependencies>
>> <dependency>
>> <groupId>my.group</groupId>
>> <artifactId>openjpa</artifactId>
>> <version>2.4.2</version>
>> <type>bundle</type>
>> </dependency>
>> </dependencies>
>>
>> Do you think I missed something to declare the persistence.xml in my JPA
>> project?
>>
>>
>>
>> 2017-05-05 14:36 GMT+02:00 KasunG Gajasinghe <[email protected]>:
>>
>>>
>>> That is probably because when creating an osgi bundle, EI simply wraps
>>> around the existing jar. So, any META-INF/services you had will be hidden
>>> under that wrapped jar.
>>>
>>> You can create your own osgi bundle via maven using a simple pom.xml
>>> like this. In there, you need to mention three things.
>>>
>>> 1. Your maven dependency for openjpa-all
>>> 2. Export packages - the openjpa-all has several such as -
>>> org.apache.openjpa.*, serp.*
>>> 3. Specify the resource files to copy
>>>
>>> This ought to do it.
>>>
>>> [1] https://github.com/wso2/orbit/blob/master/hazelcast/3.5.
>>> 4.wso2v2/pom.xml
>>>
>>> On Fri, May 5, 2017 at 2:07 PM, Thomas LEGRAND <
>>> [email protected]> wrote:
>>>
>>>> Hello,
>>>>
>>>> That seems to be OK :)
>>>>
>>>> osgi> p org.apache.openjpa.persistence
>>>> org.apache.openjpa.persistence; version="0.0.0"<openjpa_all_2.4.2_1.0.0
>>>> [132]>
>>>> org.apache.openjpa.persistence; version="2.3.0"<tomee_1.7.2.wso2v2
>>>> [632]>
>>>> compass_2.0.1.wso2v2 [54] imports
>>>> tomcat_7.0.75.wso2v1 [627] imports
>>>> osgi> ss openjpa
>>>> "Framework is launched."
>>>>
>>>>
>>>> id State Bundle
>>>> 132 ACTIVE openjpa_all_2.4.2_1.0.0
>>>> osgi>
>>>>
>>>> So, I deployed my little JPA project and I can see that my package is
>>>> "registered":
>>>>
>>>> osgi> p my.little.project.jpa
>>>> my.little.project.jpa; version="1.0.0"<mylittleproject-jpa_1.0.0 [60]>
>>>> synapse-core_2.1.7.wso2v13 [619] imports
>>>> osgi>
>>>>
>>>> So I tried to invoke my class to retrieve an EntityManager and now, I
>>>> have:
>>>>
>>>> javax.persistence.PersistenceException: Failed to load provider from
>>>> META-INF/services
>>>>
>>>> I think that it is because the services/ directory in the META-INF in
>>>> the openjpa bundle is not parsed and I don't know what to do because this
>>>> is not me who generate the OSGi bundle but the ESB at startup.
>>>>
>>>> Do you have an idea?
>>>>
>>>> Regards,
>>>>
>>>> Thomas
>>>>
>>>>
>>>> 2017-05-04 20:37 GMT+02:00 KasunG Gajasinghe <[email protected]>:
>>>>
>>>>>
>>>>> I do not think openjpa register any osgi services. Can you check
>>>>> whether the package is exposed? Also verify the status of the openjpa
>>>>> bundle.
>>>>>
>>>>> osgi> p org.apache.openjpa.persistence
>>>>> osgi> ss openjpa
>>>>>
>>>>> On Thu, May 4, 2017 at 7:01 PM, Thomas LEGRAND <
>>>>> [email protected]> wrote:
>>>>>
>>>>>> Hello again :)
>>>>>>
>>>>>> I retrieved the openjpa-all-2.4.2.jar file and dropped it in the
>>>>>> <WSO2_ESB_HOME>/lib
>>>>>> directory to let the runtime taking care of the bundle generation during
>>>>>> the startup. The effect was the generation of the file
>>>>>> openjpa_all_2.4.2_1.0.0.jar in the directory <WSO2_ESB_HOME>/dropins.
>>>>>>
>>>>>> I restarted the EI with:
>>>>>>
>>>>>> D:\ProjetESB\wso2ei-6.0.0\bin> .\integrator.bat -DosgiConsole=19444
>>>>>>
>>>>>> So I can connect to the OSGI console via telnet. But, when I try to
>>>>>> retrieve the objectclasses starting with org.apache.openjpa.*, I have
>>>>>> nothing :(
>>>>>>
>>>>>> osgi> services (objectclass=org.apache.openjpa.*)
>>>>>> "No registered services."
>>>>>>
>>>>>> Am I missing something?
>>>>>>
>>>>>> Regards,
>>>>>>
>>>>>> Thomas
>>>>>>
>>>>>> 2017-05-04 10:49 GMT+02:00 KasunG Gajasinghe <[email protected]>:
>>>>>>
>>>>>>> Hi Thomas,
>>>>>>>
>>>>>>> Well, the connector itself cannot be deployed as an osgi bundle.
>>>>>>> But, you can call classes in osgi bundles from your connector. So, place
>>>>>>> your JPA logic in an osgi bundle and add it to dropins/ folder. Then,
>>>>>>> call
>>>>>>> that from your connector.
>>>>>>>
>>>>>>> This should give you flexibility over your classloading. I cannot
>>>>>>> comment on JPA stuff though.
>>>>>>>
>>>>>>> On Thu, May 4, 2017 at 1:26 PM, Thomas LEGRAND <
>>>>>>> [email protected]> wrote:
>>>>>>>
>>>>>>>> Hello KasunG,
>>>>>>>>
>>>>>>>> I forgot to mention that I am using wso2ei-6.0.0.
>>>>>>>>
>>>>>>>> During the build of my connector, I noticed that a .jar is created
>>>>>>>> with the .zip for the connector so I tried to deploy it. Actually, I
>>>>>>>> tried
>>>>>>>> the following directories and my sequence does not find any of the
>>>>>>>> components like if my connector was not deployed :
>>>>>>>> - <WSO2_ESB_HOME>/repository/components/dropins (this directory
>>>>>>>> did not exist so I created it)
>>>>>>>> - <WSO2_ESB_HOME>/dropins
>>>>>>>>
>>>>>>>> In addition, I don't find anything in the documentation mentioning
>>>>>>>> that we can deploy connectors as an OSGi bundle :(
>>>>>>>>
>>>>>>>> When I deploy the .zip of the connector via the interface, it is
>>>>>>>> deployed in <WSO2_ESB_HOME>/repository/deployment/server/synapse-libs
>>>>>>>> which is the same directory used by Synapse:
>>>>>>>> http://synapse.apache.org/userguide/template_library.html
>>>>>>>>
>>>>>>>> Concerning the "architecture" of my component, I deployed a .zip
>>>>>>>> with a META-INF directory containing the persistence.xml but I don't
>>>>>>>> think
>>>>>>>> it is used like the absence of mention in the Synaspe documentation
>>>>>>>> above.
>>>>>>>> :) Then, I call OpenJPA with the following lines:
>>>>>>>>
>>>>>>>> EntityManagerFactory emf = Persistence.createEntityManage
>>>>>>>> rFactory("my-pu");
>>>>>>>> EntityManager mgr = emf.createEntityManager();
>>>>>>>>
>>>>>>>> But then, I have the exception.
>>>>>>>>
>>>>>>>> I made a topic on StackOverflow one or two weeks ago:
>>>>>>>> https://stackoverflow.com/questions/43538743/wso2-is-there-a
>>>>>>>> -way-to-use-jpa-in-a-custom-connector
>>>>>>>>
>>>>>>>> I you know a documentation to generate an OSGi bundle for a
>>>>>>>> connector, I am very interested. :)
>>>>>>>>
>>>>>>>> Regards,
>>>>>>>>
>>>>>>>> Thomas
>>>>>>>>
>>>>>>>> 2017-05-03 18:29 GMT+02:00 KasunG Gajasinghe <[email protected]>:
>>>>>>>>
>>>>>>>>> You are working in an OSGi environment, so you need to be thinking
>>>>>>>>> from the osgi classloading perspective. Each osgi bundle under
>>>>>>>>> repository/components/{plugins,dropins} has its own classloader
>>>>>>>>> and a classpath.
>>>>>>>>>
>>>>>>>>> Hence, the place you put your persistence.xml is important. I'm
>>>>>>>>> not sure how you call OpenJPA, so I cannot comment on what steps to
>>>>>>>>> follow.
>>>>>>>>> But in essence, re-build your connector as an osgi bundle (its just a
>>>>>>>>> jar
>>>>>>>>> with a set of manifest entries in MANIFEST.MF), and place it in
>>>>>>>>> repository/components/dropins. I have not tested this myself though.
>>>>>>>>>
>>>>>>>>> Regards,
>>>>>>>>> KasunG
>>>>>>>>>
>>>>>>>>>
>>>>>>>>> On Wed, May 3, 2017 at 8:38 PM, Thomas LEGRAND <
>>>>>>>>> [email protected]> wrote:
>>>>>>>>>
>>>>>>>>>> Hello everybody,
>>>>>>>>>>
>>>>>>>>>> I am currently writing a custom connector to retrieve information
>>>>>>>>>> from a database. Because the mediators to do so does not fit my
>>>>>>>>>> needs, I am
>>>>>>>>>> using a custom Java class which is currently implemented to retrieve
>>>>>>>>>> a
>>>>>>>>>> DataSource via the JNDI name I configured in the ESB interface. That
>>>>>>>>>> works
>>>>>>>>>> nicely :)
>>>>>>>>>>
>>>>>>>>>> But then, for maintenance purpose, I would like to use JPA
>>>>>>>>>> (preferably, the OpenJPA implementation :)) but it is like the
>>>>>>>>>> persistence.xml is not even read. :(
>>>>>>>>>> My libraries are placed in the lib/ directory in the generated
>>>>>>>>>> zip of my connector and I don't have any problem using the classes of
>>>>>>>>>> OpenJPA. Actually, just this error message appears:
>>>>>>>>>>
>>>>>>>>>> 1 INFO [PassThroughMessageProcessor-313] openjpa.Runtime -
>>>>>>>>>> Starting OpenJPA 2.4.0
>>>>>>>>>> org.apache.openjpa.persistence.ArgumentException:
>>>>>>>>>> The persistence provi der is attempting to use properties in the
>>>>>>>>>> persistence.xml file to resolve the data source. A Java Database
>>>>>>>>>> Connectivity (JDBC) driver or data source class name must be
>>>>>>>>>> specified in
>>>>>>>>>> the openjpa.ConnectionDriverName or javax.persistence.jdbc.driver
>>>>>>>>>> property.
>>>>>>>>>> The following properties are available in the configuration:
>>>>>>>>>> "org.apache.openjpa.jdbc.conf.JDBCConfigurationImpl@442ce698".
>>>>>>>>>>
>>>>>>>>>> In the persistence.xml, you have the following content :
>>>>>>>>>>
>>>>>>>>>> <?xml version="1.0" encoding="UTF-8"?>
>>>>>>>>>> <persistence version="2.0" xmlns="http://java.sun.com/xml
>>>>>>>>>> /ns/persistence"
>>>>>>>>>> xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
>>>>>>>>>> xsi:schemaLocation="http://java.sun.com/xml/ns/persistence
>>>>>>>>>> http://java.sun.com/xml/ns/persistence/persistence_2_0.xsd">
>>>>>>>>>> <persistence-unit name="my-pu" transaction-type="RESOURCE_LOC
>>>>>>>>>> AL">
>>>>>>>>>> <provider>org.apache.openjpa.p
>>>>>>>>>> ersistence.PersistenceProviderImpl</provider>
>>>>>>>>>> <jta-data-source>jdbc/MyDataSource</jta-data-source>
>>>>>>>>>> </persistence-unit>
>>>>>>>>>> </persistence>
>>>>>>>>>>
>>>>>>>>>> Is there some hidden magic to make it work?
>>>>>>>>>>
>>>>>>>>>> Thank you :)
>>>>>>>>>>
>>>>>>>>>> Regards,
>>>>>>>>>>
>>>>>>>>>> Thomas
>>>>>>>>>>
>>>>>>>>>> _______________________________________________
>>>>>>>>>> Dev mailing list
>>>>>>>>>> [email protected]
>>>>>>>>>> http://wso2.org/cgi-bin/mailman/listinfo/dev
>>>>>>>>>>
>>>>>>>>>>
>>>>>>>>>
>>>>>>>>>
>>>>>>>>> --
>>>>>>>>>
>>>>>>>>> *Kasun Gajasinghe*Associate Technical Lead, WSO2 Inc.
>>>>>>>>> email: kasung AT spamfree wso2.com
>>>>>>>>> linked-in: http://lk.linkedin.com/in/gajasinghe
>>>>>>>>> blog: http://kasunbg.org
>>>>>>>>> phone: +1 650-745-4499 <(650)%20745-4499>, 77 678 0813
>>>>>>>>>
>>>>>>>>>
>>>>>>>>
>>>>>>>>
>>>>>>>
>>>>>>>
>>>>>>> --
>>>>>>>
>>>>>>> *Kasun Gajasinghe*Associate Technical Lead, WSO2 Inc.
>>>>>>> email: kasung AT spamfree wso2.com
>>>>>>> linked-in: http://lk.linkedin.com/in/gajasinghe
>>>>>>> blog: http://kasunbg.org
>>>>>>> phone: +1 650-745-4499 <(650)%20745-4499>, 77 678 0813
>>>>>>>
>>>>>>>
>>>>>>
>>>>>>
>>>>>
>>>>>
>>>>> --
>>>>>
>>>>> *Kasun Gajasinghe*Associate Technical Lead, WSO2 Inc.
>>>>> email: kasung AT spamfree wso2.com
>>>>> linked-in: http://lk.linkedin.com/in/gajasinghe
>>>>> blog: http://kasunbg.org
>>>>> phone: +1 650-745-4499 <(650)%20745-4499>, 77 678 0813
>>>>>
>>>>>
>>>>
>>>>
>>>
>>>
>>> --
>>>
>>> *Kasun Gajasinghe*Associate Technical Lead, WSO2 Inc.
>>> email: kasung AT spamfree wso2.com
>>> linked-in: http://lk.linkedin.com/in/gajasinghe
>>> blog: http://kasunbg.org
>>> phone: +1 650-745-4499 <(650)%20745-4499>, 77 678 0813
>>>
>>>
>>
>>
>
>
> --
>
> *Kasun Gajasinghe*Associate Technical Lead, WSO2 Inc.
> email: kasung AT spamfree wso2.com
> linked-in: http://lk.linkedin.com/in/gajasinghe
> blog: http://kasunbg.org
> phone: +1 650-745-4499 <(650)%20745-4499>, 77 678 0813
>
>
_______________________________________________
Dev mailing list
[email protected]
http://wso2.org/cgi-bin/mailman/listinfo/dev