Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

jar file loadpath issue #88

Open
wants to merge 5 commits into
base: master
Choose a base branch
from
Open

jar file loadpath issue #88

wants to merge 5 commits into from

Conversation

n-ando
Copy link

@n-ando n-ando commented Aug 26, 2021

jar file loadpath issue
https://openrtm.org/openrtm/ja/content/openrtm-users-02802-java%E7%89%88%E3%81%AErtcd%E3%81%AE%E5%8B%95%E4%BD%9C%E3%81%AB%E3%81%A4%E3%81%84%E3%81%A6

Identify the Bug

カレントディレクトリでrtcdを起動する場合,
ディレクトリ内に,

  • rtc - ConsoleOut.dll
  • ConsoleIn.dll
  • conf - rtc.conf
    のように配置されている場合,
    manager.modules.load_path : rtc
    manager.modules.preload : ConsoleIn.dll, ConsoleOut.dll
    manager.components.precreate : ConsoleIn, ConsoleOut
    のように設定するのが定石と考えていますが,
    現状のJava版では,相対パスをパッケージ名と解釈するコードがある

Description of the Change

manager.modules.preloadに設定されたものが
jarファイルの場合に,RTCのクラス名がデフォルトパッケージにある,という前提を元に,
jarをURLClassLoaderで開き,クラス名からClass型オブジェクトを生成

前提条件

Javaで jarファイル内の特定のクラスをロードするおよびエントリーポイント関数を呼び出す場合は以下の条件・情報が必要

  • jarファイルがCLASSPATH配下になければいけない
  • ロードするクラスのクラス名が必要
    • 通常classファイルはクラス名
    • jarファイルはそうとは限らない
  • ロードするクラスのパッケージ名が必要
    • パッケージ名は作成する人が任意につけることができる。
    • RTCBuilderで生成すると無名パッケージ名となる。
    • 一方、ConsoleIn, ConsoleOutはRTMExample.SimpleIO というパッケージ名が設定されている
  • ロードするクラスの特定のエントリポイントの関数名が必要
    • RTCのエントリポイントは registerModle()

rtc.conf での指定方法について検討

例えば以下のように指定できるようにする。

# ↓この下にjarやclassがいろいろ入っている
manager.modules.load_path: /usr/share/openrtm-2.0/components/java, /home/work, /home/openrtm/katkin_ws

# ConsoleIn ConsoleOut.class→ classのRTC指定
# jarの指定→以下のようにjarファイルを指定技ごカッコ()内でパッケージ名・クラス名・初期化関数名を指定
# → この方法は他の言語との互換性も一応ある(他言語はカッコ内は初期化関数のみ)
# <module_name>(.<extention>) (package_names..class_name::init_func_name), ...
manager.modules.preload: ConsoleIn, ConsoleOut.class, SeqIn.jar (RTMExxamples.SeqIO.SequenceIn:myRegisterModule)

Verification

  • Did you succeed the build?
  • No warnings for the build?
  • Have you passed the unit tests?

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
None yet
Projects
None yet
Development

Successfully merging this pull request may close these issues.

1 participant