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->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->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のものに置き換え