0

書こうとしているサービスに問題があります。Windows システムのバックグラウンドで実行されるが Java を使用するサービスを作成しようとしています。これを行ういくつかの方法を見てきましたが、私の要件を満たすと思われる方法を 1 つ決定しました。このサービスは、作業が必要な項目についてデータベースをチェックします。DB 内で必要なアイテムが見つかると、いくつかのシステム コマンドを実行してそれらを処理します。

私は tomcat7.exe ファイルを使用して jar をサービスとして実行する方法を見つけました。私が jar ファイル "myService.jar" に書き込んでコンパイルすると、それを呼び出すことができます。問題は、DB にアクセスし、BGLib-1.0.jar と呼ばれるクラスのライブラリでプリコンパイルされたコマンドを実行するために記述されたいくつかのクラスが既にあることです。

私はこのライブラリを使用していくつかの jenkins プラグインを作成しましたが、関数の呼び出しに問題はありませんでした。hpi ファイルを作成して Jenkins にデプロイすると、すべて正常に動作します。そこで、コンパイラ (Maven を使用する Eclipse) が BGLib jar をプラグイン jar と一緒にパッケージ化し、Jenkins がそれらを相互に認識させる方法を見つけ出します。

しかし、サービス jar をビルドすると、デプロイしても機能しません。

次のようなコマンドを実行して、Tomcat exe の名前を myservice.exe に変更してインストールします。

d:\myService\bin>myService.exe //IS//myService --Install=D:\myService\bin\myService.exe --Description="run some commands
Java Service" --Jvm=auto --Classpath=D:\myService\jar\myService.jar;D:\myService\jar\BGLib-1.0.jar --StartMode=jvm --
StartClass=com.myCompany.myService.myService --StartMethod=windowsService --StartParams=start --StopMode=jvm --StopClass
=com.myCompany.myService.myService --StopMethod=windowsService --StopParams=stop --LogPath=D:\myService\logs --StdOutpu
t=auto --StdError=auto

これを myService.jar 内のコードのみで展開すると、サービスは期待どおりに動作しますが、BGLib-1.0.jar 内で関数を呼び出そうとしても何も得られません。jvm がクラッシュするか、応答しなくなったように見えます。デバッグは少しトリッキーですが、クラスが見つからないというエラーが発生しているようです。

マニフェストのクラスパス エントリを変更すると役立つかどうかを確認するために、POM ファイルに以下のエントリを追加しようとしましたが、マニフェストは変更されませんでした。マニフェスト ファイルがどのように機能するかについては、私はまだ無知です。それに関するドキュメントはクールでしょう。Maven のサイトに行ったことがありますが、利用可能なタグに関する包括的なドキュメントがないようです。jar に外部クラスを表示させるために、マニフェストで変更する必要があるものはありますか? または、Maven がその jar ファイルからクラスを自分の jar ファイルにコンパイルするように追加できるものはありますか?

前もって感謝します。

<configuration>
          <archive>
            <manifest>
              <addClasspath>true</addClasspath>
              <mainClass>com.myCompany.myService.myService</mainClass>
              <customClasspathLayout>BGLib-1.0.jar</customClasspathLayout>
            </manifest>
          </archive>
        </configuration>
4

3 に答える 3

0

主にタイトルの質問に答えるために、シェード プラグインを使用して依存関係を最終的な jar に含めることができます。含まれるクラスがクラスパス上の影付きの依存関係の異なるバージョンと競合しないように、最終的な jar 内でクラス ファイルを再配置することもできます (パッケージ名の変更など)。ただし、これが特定の問題に対する最良の解決策であるかどうかはわかりません。

于 2013-02-15T08:48:20.463 に答える
0

maven-dependency-plugin unpack-dependencies ゴールを使用して、結果のアーティファクトに依存関係の内容を含めることができます。

これを行う方法の例は次のとおりです。

        <plugin>
            <artifactId>maven-dependency-plugin</artifactId>
            <executions>
                <execution>
                    <id>${project.artifactId}-fetch-deps</id>
                    <phase>generate-sources</phase>
                    <goals>
                        <goal>unpack-dependencies</goal>
                    </goals>
                    <configuration>
                        <outputDirectory>${project.build.outputDirectory}</outputDirectory>
                        <stripVersion>true</stripVersion>
                        <excludeTransitive>true</excludeTransitive>
                        <includeArtifactIds>protobuf-java</includeArtifactIds>
                    </configuration>
                </execution>
            </executions>
        </plugin>

これにより、protobuf-java 依存関係が展開され (平坦化され)、ビルドによって生成された結果のアーティファクトにコンテンツが含まれます。

于 2013-08-21T15:19:07.110 に答える
0

あなたが実際にappassemblyr-maven-pluginを使用したいように見えます。それ以外の場合は、maven-shade-plugin を使用します。

于 2013-08-21T17:35:07.570 に答える