【问题标题】:Pre-programmed feature installs at apache karaf launch在 apache karaf 启动时安装预编程功能
【发布时间】:2020-07-16 02:30:32
【问题描述】:

我正在开发一个使用 apache karaf 的 opendaylight 项目。在程序开始时,我需要 karaf 安装一些功能。目前(并且可行)我手动将其输入到 shell 中并安装了功能:

$ bin/karaf
Apache Karaf starting up. Press Enter to open the shell now...
100% [========================================================================]
Karaf started in 9s. Bundle stats: 409 active, 410 total

    ________                       ________                .__  .__       .__     __
    \_____  \ ______   ____   ____ \______ \ _____  ___.__.|  | |__| ____ |  |___/  |_
     /   |   \\____ \_/ __ \ /    \ |    |  \\__  \<   |  ||  | |  |/ ___\|  |  \   __\
    /    |    \  |_> >  ___/|   |  \|    `   \/ __ \\___  ||  |_|  / /_/  >   Y  \  |
    \_______  /   __/ \___  >___|  /_______  (____  / ____||____/__\___  /|___|  /__|
            \/|__|        \/     \/        \/     \/\/            /_____/      \/


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 OpenDaylight.

opendaylight-user@root>feature:install odl-restconf odl-mdsal-apidocs odl-openflowplugin-flow-services-rest odl-openflowplugin-app-table-miss-enforcer odl-openflowplugin-nxm-extensions odl-restconf-all odl-openflowplugin-flow-services
opendaylight-user@root>

所有这些都有效。但是,我需要的是在开始时自动安装此功能。我知道有一个shell.init.script 文件,我试图将此行添加到它的底部:

feature:install odl-restconf odl-mdsal-apidocs odl-openflowplugin-flow-services-rest odl-openflowplugin-app-table-miss-enforcer odl-openflowplugin-nxm-extensions odl-restconf-all odl-openflowplugin-flow-services

但是当我这样做时,我收到以下错误:

/opt/opendaylight-0.11.0/etc/shell.init.script: Command not found: feature:install

我也知道将 featuresBoot 元素添加到 org.apache.karaf.features.cfg

featuresBoot = odl-restconf(为了便于测试,我将其缩短为一个功能)

我得到这个错误:

org.apache.felix.resolver.reason.ReasonException: Unable to resolve root: missing requirement [root] osgi.identity; osgi.identity=odl-restconf; type=karaf.feature; version="[1.10.0,1.10.0]"; filter:="(&(osgi.identity=odl-restconf)(type=karaf.feature)(version>=1.10.0)(version<=1.10.0))" [caused by: Unable to resolve odl-restconf/1.10.0: missing requirement [odl-restconf/1.10.0] osgi.identity; osgi.identity=odl-restconf-nb-rfc8040; type=karaf.feature; version="[1.10.0,1.10.0]" [caused by: Unable to resolve odl-restconf-nb-rfc8040/1.10.0: missing requirement [odl-restconf-nb-rfc8040/1.10.0] osgi.identity; osgi.identity=odl-restconf-common; type=karaf.feature; version="[1.10.0,1.10.0]" [caused by: Unable to resolve odl-restconf-common/1.10.0: missing requirement [odl-restconf-common/1.10.0] osgi.identity; osgi.identity=odl-mdsal-broker; type=karaf.feature; version="[1.10.0,1.10.0]" [caused by: Unable to resolve odl-mdsal-broker/1.10.0: missing requirement [odl-mdsal-broker/1.10.0] osgi.identity; osgi.identity=org.opendaylight.controller.sal-binding-broker-impl; type=osgi.bundle; version="[1.10.0,1.10.0]"; resolution:=mandatory [caused by: Unable to resolve org.opendaylight.controller.sal-binding-broker-impl/1.10.0: missing requirement [org.opendaylight.controller.sal-binding-broker-impl/1.10.0] osgi.wiring.package; filter:="(&(osgi.wiring.package=org.osgi.service.blueprint)(version>=1.0.0)(!(version>=2.0.0)))"]]]]]

所以,我可以说 karaf 至少承认 shell.init.script 和 org.apache.karaf.features.cfg,但是我显然使用了错误的语法。我已经用尽了谷歌搜索来找到正确的语法或找到这方面的例子。事实上,当我为这个问题使用谷歌搜索时,我得到的建议是“使用 shell.init.script”文件,没有示例或文档链接来说明如何使用它。

例如,这里有一个类似的问题script to run commands at start of apache karaf,但答案确实不完整或不完整。我不知道在哪里放置建议的命令等。

无论如何,我希望这里有人可以告诉我在 shell.init.script 或 org.apache.karaf.features.cfg 中使用什么特定命令来实现这一目标。 (目标是等效的初始化命令来完成我可以手动成功完成的操作,如顶部所述)

更新: 我也试过这种类型的命令:

echo "feature:install odl-restconf odl-mdsal-apidocs odl-openflowplugin-flow-services-rest odl-openflowplugin-app-table-miss-enforcer odl-openflowplugin-nxm-extensions odl-restconf-all odl-openflowplugin-flow-services" | /opt/opendaylight-0.11.0/bin/karaf

这也不起作用。我没有收到任何错误消息,我只知道我的 restconf 不起作用。有趣的是,我确实看到所有功能都通过管道传输到 karaf shell 中,并且 shell 似乎确实冻结了(似乎它正在处理命令),但是在光标返回给我之后就不行了。

感谢@jamo,因为他的回答让我找到了答案。我只需要将它添加到 etc/org.apache.karaf.features.cfg:

featuresBoot = odl-restconf,odl-mdsal-apidocs,odl-openflowplugin-flow-services-rest,odl-openflowplugin-app-table-miss-enforcer,odl-openflowplugin-nxm-extensions,odl-restconf-all,odl-openflowplugin-flow-services, 25921329-8d07-420b-af13-94948bf1a78d

我相信诀窍在于拥有最终的 25921329-8d07-420b-af13-94948bf1a78d,这是默认 cfg 文件中的一些十六进制值,我确保它保留在那里。

【问题讨论】:

    标签: apache-karaf opendaylight apache-karaf-feature


    【解决方案1】:

    我们只在上游 ODL 中使用 org.apache.karaf.features.cfg 文件 系统测试。你可以在this log 中看到它,但具体来说,这里是 它看起来像我们的 yangtools 工作之一:

    ################################################################################
    #
    #    Licensed to the Apache Software Foundation (ASF) under one or more
    #    contributor license agreements.  See the NOTICE file distributed with
    #    this work for additional information regarding copyright ownership.
    #    The ASF licenses this file to You under the Apache License, Version 2.0
    #    (the "License"); you may not use this file except in compliance with
    #    the License.  You may obtain a copy of the License at
    #
    #       http://www.apache.org/licenses/LICENSE-2.0
    #
    #    Unless required by applicable law or agreed to in writing, software
    #    distributed under the License is distributed on an "AS IS" BASIS,
    #    WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
    #    See the License for the specific language governing permissions and
    #    limitations under the License.
    #
    ################################################################################
    
    #
    # Comma separated list of features repositories to register by default
    #
    featuresRepositories = mvn:org.opendaylight.integration/features-test/0.12.1-SNAPSHOT/xml/features,mvn:org.apache.karaf.decanter/apache-karaf-decanter/1.2.0/xml/features, file:${karaf.etc}/5edc7e82-415e-4254-9731-f87670633bcb.xml
    
    #
    # Comma separated list of features to install at startup
    #
    featuresBoot = odl-infrautils-ready,odl-restconf, a3fb0299-0563-4506-b1a0-059253ab43b4
    
    #
    # Resource repositories (OBR) that the features resolver can use
    # to resolve requirements/capabilities
    #
    # The format of the resourceRepositories is 
    # resourceRepositories=[xml:url|json:url],...
    # for Instance:
    #
    #resourceRepositories=xml:http://host/path/to/index.xml
    # or
    #resourceRepositories=json:http://host/path/to/index.json
    #
    
    #
    # Defines if the boot features are started in asynchronous mode (in a dedicated thread)
    #
    featuresBootAsynchronous=false
    
    #
    # Service requirements enforcement
    #
    # By default, the feature resolver checks the service requirements/capabilities of
    # bundles for new features (xml schema >= 1.3.0) in order to automatically installs
    # the required bundles.
    # The following flag can have those values:
    #   - disable: service requirements are completely ignored
    #   - default: service requirements are ignored for old features
    #   - enforce: service requirements are always verified
    #
    #serviceRequirements=default
    
    #
    # Store cfg file for config element in feature
    #
    #configCfgStore=true
    
    #
    # Configuration of features processing mechanism (overrides, blacklisting, modification of features)
    # XML file defines instructions related to features processing
    # versions.properties may declare properties to resolve placeholders in XML file
    # both files are relative to ${karaf.etc}
    #
    #featureProcessing=org.apache.karaf.features.xml
    #featureProcessingVersions=versions.properties
    

    您对 featuresBook 的问题有一个错字,但我猜那是 只是一个错字不是你的问题。很奇怪 feature:install 有效, 但不是 featuresBoot。

    【讨论】:

    • 哈,是的,这是一个错字,我缩短了 cmd。我现在正在尝试您的建议,谢谢。
    • 看来我需要弄清楚哪些特定的存储库与我要安装的功能相对应。我发现这很奇怪,在常规 shell 中我不需要指定任何存储库,所以我需要在这里这样做是没有意义的。不用说,开箱即用这不适用于我的 featuresBoot 列表。
    • 啊,明白了!我需要的只是 featuresBoot 部分,但我需要确保它以 25921329-8d07-420b-af13-94948bf1a78d 结尾,所以:echo 'featuresBoot = odl-restconf,odl-mdsal-apidocs,odl-openflowplugin-flow-services-rest,odl-openflowplugin-app-table-miss-enforcer,odl-openflowplugin-nxm-extensions,odl-restconf-all,odl-openflowplugin-flow-services, 25921329-8d07-420b-af13-94948bf1a78d' &gt;&gt; /opt/opendaylight-0.11.0/etc/org.apache.karaf.features.cfg 成功了吗:)
    猜你喜欢
    • 2014-11-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-07-23
    • 2013-07-15
    • 2016-07-02
    • 2017-01-19
    相关资源
    最近更新 更多