プロジェクト

全般

プロフィール

CPackによるインストーラパッケージ作成動作の整備(Java)

RTCBuilderがコンポーネント生成時に使用するテンプレートを修正し、Windows用インストーラmsiとLinuxパッケージ(deb/rpm)の動作を整えた。
C++とPython に関しては既に対応しており、JavaもC++とPythonの方針を踏襲する。
本ページは CMakeLists.txt に関する記述。
JavaのCMakeLists.txtはpythonのCMakeLists.txtをベースに作成。

配布形式

クラスファイル形式

JavaのRTCはクラスファイルを実行用のスクリプトファイルで配布する。
jarファイルでの配布も考えらるが、今回は見送る。

同梱するファイル
  • クラスファイル(*.class)
  • 実行用スクリプトファイル(Linuxの場合は *.sh Windowsの場合は *.bat)
  • RTC.xml
  • rtc.conf
  • ドキュメント(*.html) ※通常は同梱されない。

サービスポートを持つRTCの場合、idlコンパイル済みのクラスファイルを同梱する。

Jarファイル形式

jarファイルでの配布も考えらるが、時間の都合上、後回しにする。

手順

ユーザは以下の手順でWindows用インストーラmsiとLinuxパッケージ(deb/rpm)を作成する。

 $ cd プロジェクトディレクトリー
 $ mkdir build
 $ cd build
 $ cmake ..
 $ cpack

Linuxインストール

インストール方法

 $ cd プロジェクトディレクトリー/build 
 $ sudo dpkg -i  <モジュール名>_<モジュールバージョン>_amd64.deb 

展開イメージ

+--usr
   +--share
      +--openrtm-<version>
         +--components
            +--java
               +--<モジュールカテゴリ>
                   +--<モジュール名>
                      +--CMakeLists.txt
                      +--CMakeLists.txt
                      +--<モジュール名>.conf
                      +--<モジュール名>.sh
                      +--<モジュール名>.class
                      +--<モジュール名>Comp.class
                      +--<モジュール名>Impl.class
                      +--<IDLモジュール名>SVC_impl.class
                      +--RTC.xml
                      +--rtc.conf
                      +--<IDLモジュール名>
                      |  +--
                      |  +--
                      |  … idlコンパイルの出力ファイル
                      |  +--
                      |  +--
                      |
                      +--html
                         +--
                         +--
                         … ドキュメント
                         +--
                         +--

RTCの実行

  • シェルスクリプトからの実行
    $ /usr/share/openrtm-<version>/components/java/<モジュールカテゴリ>/<モジュール名>/<モジュール名>.sh
    
  • マネージャーからの実行
    rtcd_java -o manager.modules.load_path:/usr/share/openrtm-openrtm-<version>/components/java/<モジュールカテゴリ>/<モジュール名>/ -o manager.components.precreate:<モジュール名>
    

Windowsインストール

展開イメージ

+--<%RTM_ROOT%>
   +--Components
      +--java
         +--<モジュールカテゴリ>
             +--<モジュール名>
                +--CMakeLists.txt
                +--<モジュール名>.conf
                +--<モジュール名>.bat
                +--<モジュール名>.class
                +--<モジュール名>Comp.class
                +--<モジュール名>Impl.class
                +--<IDLモジュール名>SVC_impl.class
                +--RTC.xml
                +--rtc.conf
                +--<IDLモジュール名>
                |  +--
                |  +--
                |  … idlコンパイルの出力ファイル
                |  +--
                |  +--
                |
                +--html
                   +--
                   +--
                   … ドキュメント
                   +--
                   +--

CMakeLists.txt の変更

pythonのCMakeLists.txtをベースに作成。
RTC名が"ModuleName"の例を添付。

doc/CMakeLists.txt の変更

RTC名が"ModuleName"の例を添付。

install(DIRECTORY "." 
    DESTINATION "${INSTALL_PREFIX}/html" 
    COMPONENT documentation)

build_ModuleName.xmlの変更

javadocでドキュメントを生成するように修正
RTC名が"ModuleName"の例を添付

実行用スクリプト(*.sh) の変更

@@ -5,7 +5,7 @@
   FILE2=`ls ${RTM_JAVA_ROOT}/jar/commons-cli*`
   FILE3=`ls ${RTM_JAVA_ROOT}/jar/jna-?.?.?.jar`
   FILE4=`ls ${RTM_JAVA_ROOT}/jar/jna-platform-*.jar`
-  CLASSPATH=.:$FILE1:$FILE2:$FILE3:$FILE4:${RTM_JAVA_ROOT}/bin:`dirname $0`/bin
+  CLASSPATH=.:$FILE1:$FILE2:$FILE3:$FILE4:${RTM_JAVA_ROOT}/bin:`dirname $0`/bin:`dirname $0`
   echo ${CLASSPATH}
 }
 if test "x$RTM_JAVA_ROOT" = "x" ; then

ソースコードの変更点

JavaDocでエラーが発生するために、ソースコードの修正が必要。
また、直接には動作に関係ない部分であるが、気になるの点修正。

  • doxygenの形式からjavadoc形式に変更(構成やタグ)
  • 説明文内の大なり(>)、小なり(<)の対応
  • インデントを半角スペース
  • コメントの記述ミス

ModuleName.java の変点

@@ -13,26 +13,27 @@
 import jp.go.aist.rtm.RTC.RegisterModuleFunc;
 import jp.go.aist.rtm.RTC.util.Properties;

-/*!
- * @class ModuleName
- * @brief ModuleDescription
+/**
+ * ModuleName
+ * <p> 
+ * ModuleDescription
  */
 public class ModuleName implements RtcNewFunc, RtcDeleteFunc, RegisterModuleFunc {

 //  Module specification
 //  <rtc-template block="module_spec">
     public static String component_conf[] = {
-            "implementation_id", "ModuleName",
-            "type_name",         "ModuleName",
-            "description",       "ModuleDescription",
-            "version",           "1.0.0",
-            "vendor",            "VenderName",
-            "category",          "Category",
-            "activity_type",     "STATIC",
-            "max_instance",      "1",
-            "language",          "Java",
-            "lang_type",         "compile",
-            "" 
+            "implementation_id", "ModuleName",
+            "type_name",         "ModuleName",
+            "description",       "ModuleDescription",
+            "version",           "1.0.0",
+            "vendor",            "VenderName",
+            "category",          "Category",
+            "activity_type",     "STATIC",
+            "max_instance",      "1",
+            "language",          "Java",
+            "lang_type",         "compile",
+            "" 
             };
 //  </rtc-template>

ModuleNameComp.java の変点

@@ -12,9 +12,10 @@
 import jp.go.aist.rtm.RTC.RTObject_impl;
 import jp.go.aist.rtm.RTC.util.Properties;

-/*!
- * @class ModuleNameComp
- * @brief Standalone component Class
+/**
+ * ModuleNameComp
+ * <p>
+ * Standalone component Class
  *
  */
 public class ModuleNameComp implements ModuleInitProc {
@@ -26,8 +27,8 @@
       // Create a component
       RTObject_impl comp = mgr.createComponent("ModuleName");
       if( comp==null ) {
-          System.err.println("Component create failed.");
-          System.exit(0);
+          System.err.println("Component create failed.");
+          System.exit(0);
       }

       // Example
@@ -81,7 +82,7 @@
         // Initialize manager
         final Manager manager = Manager.init(args);

-        // Set module initialization proceduer
+        // Set module initialization procedure
         // This procedure will be invoked in activateManager() function.
         ModuleNameComp init = new ModuleNameComp();
         manager.setModuleInitProc(init);

ModuleNameImpl.java の変点

@@ -25,18 +25,19 @@

 import org.omg.PortableServer.POAPackage.WrongPolicy;
 import RTC.ReturnCode_t;

-/*!
- * @class ModuleNameImpl
- * @brief ModuleDescription
+/**
+ * ModuleNameImpl
+ * <p>
+ * ModuleDescription
  *
  */
 public class ModuleNameImpl extends DataFlowComponentBase {

-  /*!
-   * @brief constructor
-   * @param manager Maneger Object
+  /**
+   * constructor
+   * @param manager Manager Object
    */
-    public ModuleNameImpl(Manager manager) {  
+    public ModuleNameImpl(Manager manager) {  
         super(manager);
         // <rtc-template block="initializer">
         m_sen_val = new TimedString();
@@ -53,8 +54,8 @@

     /**
      *
-     * The initialize action (on CREATED->ALIVE transition)
-     * formaer rtc_init_entry() 
+     * The initialize action (on CREATED-&gt;ALIVE transition)
+     * former rtc_init_entry() 
      *
      * @return RTC::ReturnCode_t
      * 
@@ -72,7 +73,7 @@

         // Set service provider to Ports
         try {
-            m_sv_namePort.registerProvider("if_name", "MyService", m_if_name);
+            m_sv_namePort.registerProvider("if_name", "MyService", m_if_name);
         } catch (ServantAlreadyActive e) {
             e.printStackTrace();
         } catch (WrongPolicy e) {
@@ -89,10 +90,10 @@
         return super.onInitialize();
     }

-    /***
+    /**
      *
-     * The finalize action (on ALIVE->END transition)
-     * formaer rtc_exiting_entry()
+     * The finalize action (on ALIVE-&gt;END transition)
+     * former rtc_exiting_entry()
      *
      * @return RTC::ReturnCode_t
      * 
@@ -103,7 +104,7 @@
 //        return super.onFinalize();
 //    }

-    /***
+    /**
      *
      * The startup action when ExecutionContext startup
      * former rtc_starting_entry()
@@ -119,7 +120,7 @@
 //        return super.onStartup(ec_id);
 //    }

-    /***
+    /**
      *
      * The shutdown action when ExecutionContext stop
      * former rtc_stopping_entry()
@@ -135,7 +136,7 @@
 //        return super.onShutdown(ec_id);
 //    }

-    /***
+    /**
      *
      * The activated action (Active state entry action)
      * former rtc_active_entry()
@@ -151,7 +152,7 @@
 //        return super.onActivated(ec_id);
 //    }

-    /***
+    /**
      *
      * The deactivated action (Active state exit action)
      * former rtc_active_exit()
@@ -167,7 +168,7 @@
 //        return super.onDeactivated(ec_id);
 //    }

-    /***
+    /**
      *
      * The execution action that is invoked periodically
      * former rtc_active_do()
@@ -183,7 +184,7 @@
 //        return super.onExecute(ec_id);
 //    }

-    /***
+    /**
      *
      * The aborting action when main logic error occurred.
      * former rtc_aborting_entry()
@@ -199,7 +200,7 @@
 //      return super.onAborting(ec_id);
 //  }

-    /***
+    /**
      *
      * The error action in ERROR state
      * former rtc_error_do()
@@ -215,7 +216,7 @@
 //        return super.onError(ec_id);
 //    }

-    /***
+    /**
      *
      * The reset action that is invoked resetting
      * This is same but different the former rtc_init_entry()
@@ -231,7 +232,7 @@
 //        return super.onReset(ec_id);
 //    }

-    /***
+    /**
      *
      * The state update action that is invoked after onExecute() action
      * no corresponding operation exists in OpenRTm-aist-0.2.0
@@ -247,7 +248,7 @@
 //        return super.onStateUpdate(ec_id);
 //    }

-    /***
+    /**
      *
      * The action that is invoked when execution context's rate is changed
      * no corresponding operation exists in OpenRTm-aist-0.2.0
@@ -262,7 +263,9 @@
 //    protected ReturnCode_t onRateChanged(int ec_id) {
 //        return super.onRateChanged(ec_id);
 //    }
-//
+
+    /**
+     */
     // DataInPort declaration
     // <rtc-template block="inport_declare">
     protected TimedString m_sen_val;
@@ -307,55 +310,55 @@
     // </rtc-template>

-    private void initializeParam(Object target) {
-        Class<?> targetClass = target.getClass();
-        ClassLoader loader = target.getClass().getClassLoader();
-        //
-        Field[] fields = targetClass.getFields();
-        for(Field field : fields) {
-            if(field.getType().isPrimitive()) continue;
-            
-            try {
-                if(field.getType().isArray()) {
-                    Object arrayValue = null;
-                    Class<?> clazz = null;
-                    if(field.getType().getComponentType().isPrimitive()) {
-                        clazz = field.getType().getComponentType();
-                    } else {
-                            clazz = loader.loadClass(field.getType().getComponentType().getName());
-                    }
-                    arrayValue = Array.newInstance(clazz, 0);
-                    field.set(target, arrayValue);
-                    
-                } else {
-                    Constructor<?>[] constList = field.getType().getConstructors();
-                    if(constList.length==0) {
-                        Method[] methodList = field.getType().getMethods();
-                        for(Method method : methodList) {
-                            if(method.getName().equals("from_int")==false) continue;
-                            Object objFld = method.invoke(target, new Object[]{ new Integer(0) });
-                            field.set(target, objFld);
-                            break;
-                        }
-                        
-                    } else {
-                        Class<?> classFld = Class.forName(field.getType().getName(), true, loader);
-                        Object objFld = classFld.newInstance();
-                        initializeParam(objFld);
-                        field.set(target, objFld);
-                    }
-                }
-            } catch (ClassNotFoundException e) {
-                e.printStackTrace();
-            } catch (InstantiationException e) {
-                e.printStackTrace();
-            } catch (IllegalAccessException e) {
-                e.printStackTrace();
-            } catch (IllegalArgumentException e) {
-                e.printStackTrace();
-            } catch (InvocationTargetException e) {
-                e.printStackTrace();
-            }
-        }
-    }
+    private void initializeParam(Object target) {
+        Class<?> targetClass = target.getClass();
+        ClassLoader loader = target.getClass().getClassLoader();
+        //
+        Field[] fields = targetClass.getFields();
+        for(Field field : fields) {
+            if(field.getType().isPrimitive()) continue;
+            
+            try {
+                if(field.getType().isArray()) {
+                    Object arrayValue = null;
+                    Class<?> clazz = null;
+                    if(field.getType().getComponentType().isPrimitive()) {
+                        clazz = field.getType().getComponentType();
+                    } else {
+                            clazz = loader.loadClass(field.getType().getComponentType().getName());
+                    }
+                    arrayValue = Array.newInstance(clazz, 0);
+                    field.set(target, arrayValue);
+                    
+                } else {
+                    Constructor<?>[] constList = field.getType().getConstructors();
+                    if(constList.length==0) {
+                        Method[] methodList = field.getType().getMethods();
+                        for(Method method : methodList) {
+                            if(method.getName().equals("from_int")==false) continue;
+                            Object objFld = method.invoke(target, new Object[]{ new Integer(0) });
+                            field.set(target, objFld);
+                            break;
+                        }
+                        
+                    } else {
+                        Class<?> classFld = Class.forName(field.getType().getName(), true, loader);
+                        Object objFld = classFld.newInstance();
+                        initializeParam(objFld);
+                        field.set(target, objFld);
+                    }
+                }
+            } catch (ClassNotFoundException e) {
+                e.printStackTrace();
+            } catch (InstantiationException e) {
+                e.printStackTrace();
+            } catch (IllegalAccessException e) {
+                e.printStackTrace();
+            } catch (IllegalArgumentException e) {
+                e.printStackTrace();
+            } catch (InvocationTargetException e) {
+                e.printStackTrace();
+            }
+        }
+    }
 }

MyServiceSVC_impl の変点

@@ -4,8 +4,9 @@
  * @brief Service implementation code of MyService.idl
  *
  */
-/*!
- * @class MyServiceSVC_impl
+/**
+ * MyServiceSVC_impl
+ * <p>
  * Example class implementing IDL interface MyService
  */
 public class MyServiceSVC_impl extends MyServicePOA{

1.1.0で生成したプロジェクトで行う場合(メモ)

  • CMakeLists.txtを1.2.0からコピー
  • CMakeLists.txt内のモジュール名の置換
  • COPYING.LESSERを1.2.0からコピー
  • /cmake/CMakeLists.txt を1.2.0のものに置き換え
  • /cmake/cpack_options.cmake.in を1.2.0のものに置き換え