2017-02-15 11 views
0

私たちはCで書かれたシステムをJavaに移行しており、既存のプロセスを保持する必要があります(議論はありません)。 xxx.cファイルは、その後、「COMP_ARG」を使用することができ、その値はコードに埋め込まれます実行時にJavaコンパイル時のパラメータにアクセスするにはどうすればよいですか?

cc -o xxx.o -DCOMP_ARG='"compile time arg"' xxx.c 

と私たち:我々は現在、例えば、Cプリプロセッサを使用してCアプリケーションにコンパイル時の情報を「埋め込みます」それが誤って変更される心配はほとんどありません。

Javaはプロパティファイルを使用したいと思いますが、いくつかの情報**がコードに埋め込まれているため、プロパティファイルはオプションではありません。これらの値は実行時に指定できません。要点を説明するために、そのようなデータは、ファイルがコンパイルされた日付スタンプであってもよいが、正確なデータはその質問とは無関係である。

コンパイル時に、Javaコードで使用可能なさまざまな値を指定する方法を探しています。 JavaはCと同様にプリプロセッサを持っていないので、メカニズムは異なっていることは十分認識しています。

現在のソリューションではコード生成ステップ(Maven)を使用していますが、Eclipseはソースファイルを処理しようとしているため、「自動ビルド」をオフにしています。より堅牢なソリューションを探したいと思っています。

ご協力いただきありがとうございます。

+0

プロパティのプロパティの処理? 「Eclipseはソースファイルを処理しようとしています。」とはどういう意味ですか?生成されたファイルのサンプルを投稿できますか? –

+0

はたぶんhttp://stackoverflow.com/questions/25377900/how-to-create-a-dynamic-interface-with-properties-file-at-compile-timeは読み –

+0

ザ・Eclipseの問題は別以外の無関係です価値がありますMavenフィルタを使用してテンプレートファイルを実行しないようにする理由 - この解決策は私たちをMavenにロックします。 – Jim

答えて

0

私は「出来ない」のようです私自身の答えを投稿するつもりだ - 何をすることはできません明らかに、実行時にプログラムに渡される一連のパラメータであるJavaにコンパイル時に提供されます。解決策は、私がやっていることは、Javaソースファイルをコンパイル時のデータで更新し、ファイルを上書きするのをやめるためにEclipseを同軸化する方法を理解することです。コメント誰にでも

感謝。

0

xxx.cファイルは、「COMP_ARG」を使用することができ、その値は、コード内の を埋め込まれますと、我々はそれが誤って を変更されてについて少し心配しています。

...我々の要求は、我々は、コンパイル時にJavaコードに利用可能な様々な値 を指定する方法を探しています....

いくつかの情報が コードに埋め込むことがあるようです。我々はJavaが のようにプリプロセッサを持っていないことを認識しているので、メカニズムは とは違うでしょう。

この問題を解決する最良の方法は、あなたのコード内で注釈を利用することであろうと思われます。

Javaでは、注釈は一種のインタフェース宣言ですが、実装クラスとの動作契約を強制しません。むしろ、いくつかの外部フレームワーク、プリプロセッサ、またはコンパイラ自体との契約を定義することを意図しています。アノテーションは、開発者のコ​​ードが実行されるフレームワークに対する設定と動作を指定するために、Java EE 5.0(以降)で広く使用されています。アノテーションは、JavaDocドキュメンテーションプロセッサでも広く使用されています。ここでは、ドキュメンテーションコメント内の注釈を使用して、JavaDocプロセッサの実行時にドキュメントに表示する情報を指定して書式設定することができます。

注釈は、実行時にアクセスできるように定義することができます。そのような場合、注釈にアクセスするための主なメカニズムはJava Reflection機能です。例えば、RUNTIMEとクラスで定義の保持ポリシーと注釈は、そのクラスの対応Classオブジェクトを介してアクセスすることができる。

Class myCls = MyClass.class; // the "class literal" for MyClass 
Annotation[] annotations = myCls.getDeclaredAnnotations(); 

注釈は、構成の柔軟性を可能にするために、パラメータの引数を含むことができます。注釈の使用は、コード自体に注釈を付けることができるときに最も便利です。

注釈が定義されており、Javaで使用されている方法についての簡単なチュートリアルはここにあります:https://docs.oracle.com/javase/tutorial/java/annotations/

+0

scottb - 返信いただきありがとうございます - ランタイムアノテーションを使用してデータを取得する方法を確認できますが、コンパイル時にデータ値を提供するにはどうすればよいですか? – Jim

+0

あなたの質問は、コードにデータを埋め込むことが必須であると述べました。これはあなたの目標ではないことを理解していますか?私は、情報をコードに動的にコンパイルするために受け入れられ、よく特徴づけられたメカニズムを認識していません... Javaは、強く静的に型付けされた言語であり、この目的にはあまり適していません。もちろん、実行時にXMLやコマンドライン経由でJavaプログラムにデータを提供することは可能ですが、これはあなたが求めているものではないと思われます。そのようなデータは、コンパイルされたプログラムの一部にはなりません。 – scottb

+0

私は、用語「データ」をゆるやかに使用します。私が持っている最良の例は、 'private static final String compilationTime = "xxxxxx";'ここで、xはプロセスによって置き換えられるか、コンストラクタを介して最終変数に渡されます。 XMLとプロパティに関する懸念事項は、ファイルによって提供されるものとファイルがアプリケーションと誤って一致する可能性があることです。私たちはCのためのプロセスを持っていました。多くの人が指摘しているように、Javaを使うのは苦労します。私はMavenのフィルタリングで成功の尺度を達成しましたが、より良い解決策を探していました。 – Jim

関連する問題