Search code examples
osgikaraf

How can I install postgresqljdbc to work in Karaf OSGi?


I want to install org.postgresql/postgresql/9.4-1201-jdbc41 in Karaf but I get errors. How can I resolve these errors? Strangely on Windows my Karaf doesn't have errors with this Postgres jdbc but on Ubuntu it has these errors. Any clues appreciated.

Install Kar feature social_importer.kar/1.0-SNAPSHOT
java.lang.Exception: Could not start bundle    
mvn:org.postgresql/postgresql/9.4-1201-jdbc41 in feature(s) 

T: Unresolved constraint in bundle org.postgresql.jdbc41 
[127]: Unable to resolve 127.0: missing requirement [127.0]
osgi.wiring.package; (osgi.wiring.package=javax.transaction.xa)


Caused by: org.osgi.framework.BundleException: 
Unresolved constraint in bundle org.postgresql.jdbc41 [127]: Unable 
to resolve 127.0: missing requirement [127.0] osgi.wiring.package;
(osgi.wiring.package=javax.transaction.xa)

This might be related Apache Felix not able to access Postgres JDBC


karaf@root()> install -s wrap:mvn:postgresql/postgresql/9.4-1201-jdbc41
Bundle IDs:
Error executing command: Error installing bundles:
    Unable to install bundle wrap:mvn:postgresql/postgresql/9.4-1201-jdbc41
karaf@root()> install -s mvn:postgresql/postgresql/9.4-1201-jdbc41
Bundle IDs:
Error executing command: Error installing bundles:
    Unable to install bundle mvn:postgresql/postgresql/9.4-1201-jdbc41
karaf@root()>

I looked in the Karaf logs with log level of INFO.

Caused by: java.lang.NoClassDefFoundError: org/osgi/service/jdbc/DataSourceFactory
    at org.postgresql.osgi.PGBundleActivator.start(PGBundleActivator.java:32)
    at org.apache.felix.framework.util.SecureAction.startActivator(SecureAction.java:645)
    at org.apache.felix.framework.Felix.activateBundle(Felix.java:2154)
    ... 11 more
Caused by: java.lang.ClassNotFoundException: org.osgi.service.jdbc.DataSourceFactory not found by org.postgresql.jdbc41 [5328]
    at org.apache.felix.framework.BundleWiringImpl.findClassOrResourceByDelegation(BundleWiringImpl.java:1556)[org.apache.felix.framework-4.4.1.jar:]
    at org.apache.felix.framework.BundleWiringImpl.access$400(BundleWiringImpl.java:77)[org.apache.felix.framework-4.4.1.jar:]
    at org.apache.felix.framework.BundleWiringImpl$BundleClassLoader.loadClass(BundleWiringImpl.java:1993)[org.apache.felix.framework-4.4.1.jar:]
    at java.lang.ClassLoader.loadClass(ClassLoader.java:357)[:1.8.0_25]

Solution

  • Provisioning Postgresql JDBC Driver to Karaf 4.0.1

            __ __                  ____
           / //_/____ __________ _/ __/
          / ,<  / __ `/ ___/ __ `/ /_
         / /| |/ /_/ / /  / /_/ / __/
        /_/ |_|\__,_/_/   \__,_/_/
    
      Apache Karaf (4.0.1)
    
    Hit '<tab>' for a list of available commands
    and '[cmd] --help' for help on a specific command.
    Hit '<ctrl-d>' or type 'system:shutdown' or 'logout' to shutdown Karaf.
    karaf@root()> feature:repo-add mvn:org.ops4j.pax.jdbc/pax-jdbc-features/0.7.0/xml/features
    karaf@root()>feature:install  pax-jdbc-spec
    karaf@root()>feature:install transaction
    karaf@root()>bundle:install -s mvn:org.postgresql/postgresql/9.4-1200-jdbc41
    karaf@root()> service:list org.osgi.service.jdbc.DataSourceFactory
    
    [org.osgi.service.jdbc.DataSourceFactory]
    -----------------------------------------
     osgi.jdbc.driver.class = org.postgresql.Driver
     osgi.jdbc.driver.name = PostgreSQL JDBC Driver
     osgi.jdbc.driver.version = PostgreSQL 9.4 JDBC4.1 (build 1200)
     service.bundleid = 52
     service.id = 113
     service.scope = singleton
    Provided by :
     PostgreSQL JDBC Driver JDBC41 (52)
    

    Definining a Postgres Pool Datasource to Karaf 4.0.1

    Theory at: https://ops4j1.jira.com/wiki/display/PAXJDBC/Create+DataSource+from+config

    karaf@root()>feature:install  pax-jdbc-config
    karaf@root()>feature:install  pax-jdbc-pool-dbcp2
    

    Create file under KARAF_HOME/etc/org.ops4j.datasource-companymanager.cfg where companymanager is the datasource name.

    osgi.jdbc.driver.name=PostgreSQL JDBC Driver-pool-xa
    
    serverName=localhost
    databaseName=companymanager
    portNumber=5432
    user=postgres
    password=admin
    dataSourceName=companymanager
    

    Voilá you are done, your datasource is exposed to OSGI registry ready to be used at your will:

    karaf@root()> service:list javax.sql.DataSource
    [javax.sql.DataSource]
    ----------------------
     databaseName = companymanager
     dataSourceName = companymanager
     felix.fileinstall.filename = file:/C:/apache-karaf-4.0.1/etc/org.ops4j.datasource-companymanager.cfg
     osgi.jdbc.driver.name = PostgreSQL JDBC Driver-pool-xa
     osgi.jndi.service.name = companymanager
     password = admin
     portNumber = 5432
     serverName = localhost
     service.bundleid = 64
     service.factoryPid = org.ops4j.datasource
     service.id = 119
     service.pid = org.ops4j.datasource.3cad9abf-49be-4868-8940-1623481b1363
     service.scope = singleton
     user = postgres
    Provided by :
     OPS4J Pax JDBC Config (64)
    

    The next step will be perhaps set up JPA if you are interested, you can keep reading and get the full example code from: https://github.com/antoniomaria/karaf4-eclipselink-jpa