Search code examples
javamavenblueprint-osgi

How to start OSGI-INF blueprint


I'm a beginner with OSGI-INF blueprint. I have two classes named Account and Currency. I am now trying to start my program by pressing "Run Account SHIFT+F10" in IntelliJ. I then just get this back:

Hello Account!

But I want it to write Currency method toString().

Account:

package com.domain.subdomain;

public class Account {
    private Currency currency;

    public Account() {
    }

    public void setCurrency(Currency currency){
        this.currency = currency;
    }


    public static void main(String[] args) {
        System.out.println("Hello Account!");

    }
}

Currency:

package com.domain.subdomain;

public class Currency {
    String country;
    String isoCode;
    String unit;
    String name;

    double transferPurchase;
    double transferSell;
    double transferChange;
    double transferLast;
    double transferDelta;

    double notePurchase;
    double noteSell;

    public Currency(){

    }

    public Currency(String country, String isoCode, String unit, String name, double transferPurchase, double transferSell, double transferChange, double transferLast, double transferDelta, double notePurchase, double noteSell) {
        this.country = country;
        this.isoCode = isoCode;
        this.unit = unit;
        this.name = name;
        this.transferPurchase = transferPurchase;
        this.transferSell = transferSell;
        this.transferChange = transferChange;
        this.transferLast = transferLast;
        this.transferDelta = transferDelta;
        this.notePurchase = notePurchase;
        this.noteSell = noteSell;
    }

    public static void main(String[] args) {
        System.out.println("Hello Currency!");
    }




    public String getCountry() {
        return country;
    }

    public void setCountry(String country) {
        this.country = country;
    }

    public String getIsoCode() {
        return isoCode;
    }

    public void setIsoCode(String isoCode) {
        this.isoCode = isoCode;
    }

    public String getUnit() {
        return unit;
    }

    public void setUnit(String unit) {
        this.unit = unit;
    }

    public String getName() {
        return name;
    }

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

    public double getTransferPurchase() {
        return transferPurchase;
    }

    public void setTransferPurchase(double transferPurchase) {
        this.transferPurchase = transferPurchase;
    }

    public double getTransferSell() {
        return transferSell;
    }

    public void setTransferSell(double transferSell) {
        this.transferSell = transferSell;
    }

    public double getTransferChange() {
        return transferChange;
    }

    public void setTransferChange(double transferChange) {
        this.transferChange = transferChange;
    }

    public double getTransferLast() {
        return transferLast;
    }

    public void setTransferLast(double transferLast) {
        this.transferLast = transferLast;
    }

    public double getTransferDelta() {
        return transferDelta;
    }

    public void setTransferDelta(double transferDelta) {
        this.transferDelta = transferDelta;
    }

    public double getNotePurchase() {
        return notePurchase;
    }

    public void setNotePurchase(double notePurchase) {
        this.notePurchase = notePurchase;
    }

    public double getNoteSell() {
        return noteSell;
    }

    public void setNoteSell(double noteSell) {
        this.noteSell = noteSell;
    }

    @Override
    public String toString() {
        return "Currency{" +
                "country='" + country + '\'' +
                ", isoCode='" + isoCode + '\'' +
                ", unit='" + unit + '\'' +
                ", name='" + name + '\'' +
                ", transferPurchase=" + transferPurchase +
                ", transferSell=" + transferSell +
                ", transferChange=" + transferChange +
                ", transferLast=" + transferLast +
                ", transferDelta=" + transferDelta +
                ", notePurchase=" + notePurchase +
                ", noteSell=" + noteSell +
                '}';
    }
}

OSGI-INF.blueprint.currency-ctx.xml:

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

    <bean id="accountOne" class="com.domain.subdomain.Account" init-method="startUp">
        <property name="currency" ref="currencyUS" />
    </bean>

    <bean id="accountTwo" class="com.domain.subdomain.Account" init-method="startUp">
        <property name="currency" ref="currencyEU" />
    </bean>


    <bean id="currencyUS" class="com.domain.subdomain.Currency">
        <argument value="USA"/> <!-- country -->
        <argument value="US"/> <!-- isoCode -->
        <argument value="1"/> <!-- unit -->
        <argument value="Dollar"/> <!-- name -->
        <argument value="7.91"/> <!-- transferPurchase -->
        <argument value="7.82"/> <!-- transferSell -->
        <argument value="0.83"/> <!-- transferChange -->
        <argument value="7.94"/> <!-- transferLast -->
        <argument value="7.95"/> <!-- transferDelta -->
        <argument value="7.59"/> <!-- notePurchase -->
        <argument value="8.31"/> <!-- noteSell -->
    </bean>

    <bean id="currencyEU" class="com.domain.subdomain.Currency">
        <argument value="European Union"/> <!-- country -->
        <argument value="EU"/> <!-- isoCode -->
        <argument value="1"/> <!-- unit -->
        <argument value="Euro"/> <!-- name -->
        <argument value="9.36"/> <!-- transferPurchase -->
        <argument value="9.43"/> <!-- transferSell -->
        <argument value="6.14"/> <!-- transferChange -->
        <argument value="9.33"/> <!-- transferLast -->
        <argument value="9.39"/> <!-- transferDelta -->
        <argument value="8.90"/> <!-- notePurchase -->
        <argument value="9.89"/> <!-- noteSell -->
    </bean>


</blueprint>

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>

    <groupId>com.domain.subdomain</groupId>
    <artifactId>blueprint-bank-account-example</artifactId>
    <version>1.0-SNAPSHOT</version>


    <dependencies>
        <!-- Annotations -->
        <dependency>
            <groupId>javax.inject</groupId>
            <artifactId>javax.inject</artifactId>
            <version>1</version>
            <optional>true</optional>
        </dependency>
        <dependency>
            <groupId>javax.enterprise</groupId>
            <artifactId>cdi-api</artifactId>
            <version>1.2</version>
            <optional>true</optional>
        </dependency>
        <dependency>
            <groupId>javax.persistence</groupId>
            <artifactId>persistence-api</artifactId>
            <version>1.0.2</version>
            <optional>true</optional>
        </dependency>
        <dependency>
            <groupId>javax.transaction</groupId>
            <artifactId>javax.transaction-api</artifactId>
            <version>1.2</version>
            <optional>true</optional>
        </dependency>
        <dependency>
            <groupId>org.apache.aries.blueprint</groupId>
            <artifactId>blueprint-maven-plugin-annotation</artifactId>
            <version>1.3.0</version>
            <optional>true</optional>
        </dependency>
        <dependency>
            <groupId>org.ops4j.pax.cdi</groupId>
            <artifactId>pax-cdi-api</artifactId>
            <version>0.8.0</version>
            <optional>true</optional>
        </dependency>
        <dependency>
            <groupId>org.apache.servicemix.bundles</groupId>
            <artifactId>org.apache.servicemix.bundles.spring-beans</artifactId>
            <version>3.2.11.RELEASE_1</version>
            <optional>true</optional>
        </dependency>
        <!-- //Annotations -->

        <!-- SPI -->
        <dependency>
            <groupId>org.apache.aries.blueprint</groupId>
            <artifactId>blueprint-maven-plugin-spi</artifactId>
            <version>1.1.0</version>
        </dependency>
        <!-- //SPI -->


    </dependencies>


    <build>
        <plugins>
            <!-- BluePrint -->
            <plugin>
                <groupId>org.apache.aries.blueprint</groupId>
                <artifactId>blueprint-maven-plugin</artifactId>
                <version>1.9.0</version>
                <configuration>
                    <scanPaths>
                        <scanPath>com.domain.subdomain</scanPath>
                    </scanPaths>
                </configuration>
            </plugin>
            <!-- //BluePrint -->


        </plugins>
    </build>

</project>

Solution

  • An OSGi bundle is kind of a plugin that you run inside an OSGi container (JBoss Fuse, Apache Karaf, Eclipse Equinox, ...). So you don't need a main method.

    When you build an OSGi bundle with maven, specify <packaging>bundle</packaging> and add

    <plugin>
        <groupId>org.apache.felix</groupId>
        <artifactId>maven-bundle-plugin</artifactId>
        <extensions>true</extensions>
        <version>3.3.0</version>
    </plugin>
    

    because the bundle jar has some extra headers (added by this plugin) that tells the OSGi container to load the blueprint files.

    You can imagine Blueprint as something very similar to Spring: you declare beans and dependencies in an XML file. In you case, you just declared the beans that will be instantiated, but there is no code that "does something".

    I don't know about blueprint-maven-plugin but I imagine this runs your bundle inside a small container. How do you invoke it from maven?

    I highly suspect that running your project with "Run Account SHIFT+F10" you are just basically running this application as a a regular Java application instead of an OSGi Blueprint bundle.