java - 如何启动OSGI-INF蓝图

标签 java maven blueprint-osgi

我是 OSGI-INF 蓝图的初学者。 我有两个名为“帐户”和“货币”的类(class)。我现在尝试通过在 IntelliJ 中按“运行帐户 SHIFT+F10”来启动我的程序。然后我就得到这个:

Hello Account!

但我希望它编写Currency方法toString()。

帐户:

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!");

    }
}

货币:

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>

最佳答案

OSGi bundle 是一种插件,您可以 OSGi 容器(JBoss Fuse、Apache Karaf、Eclipse Equinox 等)中运行。所以您不需要main方法。

当您使用 Maven 构建 OSGi bundle 时,请指定 <packaging>bundle</packaging>并添加

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

因为bundle jar有一些额外的 header (由这个插件添加),告诉OSGi容器加载蓝图文件。

您可以将 Blueprint 想象为与 Spring 非常相似的东西:您在 XML 文件中声明 bean 和依赖项。在你的例子中,你只是声明了将被实例化的bean,但是没有任何代码“做某事”。

我不知道 blueprint-maven-plugin但我想这会在一个小容器内运行你的包。如何从 Maven 调用它?

我高度怀疑使用“运行帐户 SHIFT+F10”运行您的项目,您基本上只是将此应用程序作为常规 Java 应用程序而不是 OSGi Blueprint 包运行。

关于java - 如何启动OSGI-INF蓝图,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/46826697/

相关文章:

java - 有选择地对已弃用的 JavaEE 模块使用第三方实现

java - jpa 的未知命名空间 - ServiceMix

java - Osgi - Virgo 3.6 - 加载应用程序上下文

java - 如何在jscrollpane中添加自动滚动条?

Java 在垃圾收集上花费了大量时间

java - 无法获得两个日期时间之间的差异?

java - Fuse OSGI + Spring JDBC 问题

java - RowHeader 样式的表格,对 rowHeader 和数据进行排序

java - 使用 context.xml 配置 WebApp 以使用 Tomcat

java - 如何将源上传到本地 Maven 存储库