2017-06-27 10 views
0

First:タイトルには申し訳ありませんが、私は質問に夢中になる方法は本当に分かりませんでした。Maven + Spring:Springでautowiredされたモジュールのリソースを使用してください。

私はいくつかのモジュールを含むmavenプロジェクトを持っています。 メインWeb-Appモジュールにいくつかの特別なロジッククラスを提供するので、すべてのモジュールは本当にシンプルです。 これらのロジッククラスは、実行時に春までに注入されます。続い

  • アルゴリズム・モジュール(特殊なアルゴリズムを提供するモジュールは、コードのいずれかを実装する(すべてのモジュール用インターフェースと基本的なクラスを提供)(簡略化のために抽象化)私のMavenのセットアップ

    • コアモジュールであります-modulesインタフェース)
    • ウェブ・アプリケーション・モジュール(@Componentとして自身を登録するアルゴリズムを使用し春Webアプリケーションが、コア及びアルゴリズムモジュールに依存する)

    問題: アルゴリズムモジュールには、システムのPythonインタプリタで実行したいリソース(この場合はpythonスクリプト)があります。 (リソース/ pythonscript.py)

    使用可能なすべてのアルゴリズムクラス(メトリックインタフェースを実装)は、ウェブアプリのコントローラにスプリングによって注入されています

    @Autowired 
    List<Metric> metrics; 
    

    その後、ユーザは自分が実行したいアルゴリズムを選択します:

    metric.performCalculations(dataset); 
    

    これは、後のモジュールのリソースディレクトリからPythonスクリプトを実行しようとロジックを実行:

    URL url = NXBetweennessCentrality.class.getResource("bc/betweenness_centrality.py"); 
    logger.debug("URL: {}", url); //=> null 
    
    class.getResourceAsStream(resourcePath) 
    class.getClassLoader().getResources("") 
    

    How do I load a file from resource folder?から、基本的にすべてが、私はこのリソースをロードすることはできません。 私はsevaral組み合わせを試してみました。

    maven dependencysプロジェクト(Use a dependency's resources?)のリソースにアクセスしようとしたときに問題が聞こえましたが、私の場合はリソースを所有するパッケージからクラスを実行しています - 問題はないはずです。思想。

    誰かが間違いを指摘できますか?これはいくつかの面倒な回避策なしでは不可能ですか?

  • 答えて

    0

    クラスをスタンドアロンで実行するとうまくいくはずです。それ以外の場合は、戦争を使用してwebappとして実行している場合は、リソースも戦争の中にバンドルされる必要があります。あなたは複数のモジュールを持っているので、PythonリソースをJARとして持っているモジュールをパッケージ化していて、その依存関係をWebアプリケーションモジュールに追加できました。この時点で、JARモジュールを提示するあなたのリソースは戦争の中で束ねられません。

    +0

    唯一の解決策は、ビルド中にリソースをWeb-Appモジュールへの依存関係から再パッケージすることでしょうか? (私にリンクされているスレッドのように?) – bigbasti

    +0

    はい。いずれかのアセンブリプラグインを使用しようとします。 Else Pythonスクリプトをサーバーの共通の場所に保管し、Webアプリケーションを実行し、実行時にPythonスクリプトの場所をVM引数に渡してロードします。 – codespawner

    0

    例:

    a.b.c.NXBetweennessCentrality.class.getResource("");

    あなたのコードのURLの平均NXBetweennessCentrality packge
    WEB-INF /クラス/ A/B/C

    がnull

    あります URL url =a.b.c.NXBetweennessCentrality.class.getResource("bc/betweenness_centrality.py");

    リソース


    WEB-INF /クラス/ A/B/C/BC/betweenness_centrality.py

    を意味

    あなたPYファイルの場合は、あなたが/」ルートを試すことができますWebアプリケーションの「パス

    getResource("/bc/betweenness_centrality.py");

    私が間違っているなら、私を訂正してください。

    +0

    ルートパスはpackege内ではなく、hddのルートにありますとにかくそれをテストしました) スクリプトは、あなたがtarget \ classes \ bcに記述したのと同じ場所にあります(しかし、WEB-INFではなくWebモジュールにはありません) – bigbasti

    0

    ので、私はそれが今、すべてのサブモジュールからのすべてのリソースが戦争をパッケージ化する前に、Webアプリのリソースディレクトリにコピーされhttps://stackoverflow.com/a/6448530/760952

    からMavenのスクリプトを使用して動作させることができました。

    すべてのモジュールが独自のリソースを保持でき、新しいリソースや新しいモジュールを追加するときに何も設定する必要がないので、これは問題ありません。

    関連する問題