78

メインを持つJavaクラスがあり、コマンドラインからスタンドアロンアプリとして実行していました。

java -jar myjar.jar params

Apache で実行するコードを再パッケージ化する必要があり、古い jar のエントリ ポイント クラスを含むすべてのコードが、Web サーバーに簡単にデプロイできるように WAR ファイルになりました。

ただし、コマンドラインから実行できるようにしたいのですが、コードは変更されておらず、すべてそこにあります。実行する方法がわかりません。

これが私が試したことです...

WARはただの瓶だと思っていたので、

java -jar mywar.war params

マニフェストにメインクラスが定義されていないと言って失敗しました。

手動でマニフェストを戦争に追加して再試行しましたが、同じ結果が得られました。

私の戦争では、manifest.mf を含む META-INF というフォルダーがあることに気付いたので、通常のマニフェストと同様に、メイン クラスを宣言する行をそのフォルダーに追加しました...

Manifest-Version: 1.0
Main-Class: mypackage.MyEntryPointClass

これはnoClassDefFoundError mypackage.MyEntryPointClassある種の進歩である を与えました。それは単なるパスの問題であると私に信じさせたので、私は試しました

Manifest-Version: 1.0
Main-Class: WEB-INF.classes.mypackage.MyEntryPointClass

同じエラーが発生しましたが、スタックトレースがあります...

Exception in thread "main" java.lang.NoClassDefFoundError: WEB-INF/classes/mypackage/MyEntryPointClass (wrong name: mypackage/MyEntryPointClass)
        at java.lang.ClassLoader.defineClass1(Native Method)
        at java.lang.ClassLoader.defineClass(Unknown Source)
        at java.security.SecureClassLoader.defineClass(Unknown Source)
        at java.net.URLClassLoader.defineClass(Unknown Source)
        at java.net.URLClassLoader.access$100(Unknown Source)
        at java.net.URLClassLoader$1.run(Unknown Source)
        at java.security.AccessController.doPrivileged(Native Method)
        at java.net.URLClassLoader.findClass(Unknown Source)
        at java.lang.ClassLoader.loadClass(Unknown Source)
        at sun.misc.Launcher$AppClassLoader.loadClass(Unknown Source)
        at java.lang.ClassLoader.loadClass(Unknown Source)
        at java.lang.ClassLoader.loadClassInternal(Unknown Source)

私は少しグーグルで調べましたが、私の質問に答えるものは何も見つかりませんでした.ここでいくつかの他の質問を読みました.

Java 1.5、それで違いが生じるとは思いません。

4

11 に答える 11

49

Hudson (継続的統合プロジェクト)が行うことを行うことができます。tomcat にデプロイしたり、使用して実行したりできる戦争をダウンロードします。

java -jar hudson.war

(Jetty エンジンが組み込まれているため、コマンド ラインから実行するとサーバーが起動します。) とにかく、hudson のマニフェストを見ると、アーカイブのルートに Main クラスが配置されていることがわかります。あなたの場合、戦争のレイアウトは次のようになります。

ルートの下:

  • mypackage/MyEntryPointClass.class
  • WEB-INF/lib
  • WEB-INF/クラス
  • META-INF/MANIFEST.MF

マニフェストには次の行を含める必要があります。

Main-Class: mypackage.MyEntryPointClass

mypackage/MyEntryPointClass.class はコマンド ラインからのみアクセス可能であり、WEB-INF/classes の下のクラスはアプリケーション サーバーからのみアクセス可能であることに注意してください。

HTH

于 2010-09-27T14:33:31.603 に答える
10

戦争はウェブアプリです。Web アプリケーションと同じクラスを再利用するコンソール/スタンドアロン アプリケーションが必要な場合は、共有クラスを jar にパッケージ化することを検討してくださいWEB-INF/lib。次に、コマンド ラインからその jar を使用します。したがって、2 つの異なるパッケージを作成することなく、両方のコンソール アプリケーションを取得し、サーブレットで同じクラスを使用できます。もちろん、これは戦争が爆発したときにも当てはまります。

于 2009-12-03T21:25:00.823 に答える
9

SomeClass.main(String [] args)デプロイされたwarファイルから実行するには、次のようにします。

  1. SomeClass.javamainメソッドメソッドを持つクラスを記述します。すなわち( public static void main(String [] args){...}
  2. WARをデプロイします
  3. cd /usr/local/<yourprojectsname>/tomcat/webapps/projectName/WEB-INF
  4. java -cp "lib/jar1.jar:lib/jar2.jar: ... :lib/jarn.jar" com.mypackage.SomeClass arg1 arg2 ... arg3

注1:クラスSomeOtherClass.class/usr/tomcat/webapps/<projectName>/WEB-INF/lib実行中であるかどうかを確認するには:

cd /usr/tomcat/webapps/projectName/WEB-INF/lib && 
find . -name '*.jar' | while read jarfile; do if jar tf "$jarfile" | grep SomeOtherClass.class; then echo "$jarfile"; fi; done 

注2:メインがコンソールへのprintステートメントを介して実際に機能するかどうかを確認できるように、標準出力に書き込みます。これはバックドアと呼ばれます。

注3:BozhidarBozhanovによる上記のコメントは正しいようです

于 2012-04-05T00:52:28.370 に答える
9

Maven を使用している場合は、 「 webapp のクラスを含む JAR を作成するにはどうすればよいですか?maven-war-plugin 」に関するドキュメントに従ってください:プラグインの に追加します。<attachClasses>true</attachClasses><configuration>

<project>
  ...
  <artifactId>mywebapp</artifactId>
  <version>1.0-SNAPSHOT</version>
  ...
  <build>
    <plugins>
      <plugin>
    <artifactId>maven-war-plugin</artifactId>
    <version>2.6</version>
    <configuration>
      <attachClasses>true</attachClasses>
    </configuration>
      </plugin>
    </plugins>
  </build>
  ...
</project>

target/フォルダには 2 つの製品があります。

  • それproject.war自体
  • project-classes.jarjar 内のすべてのコンパイル済みクラスを含む

次に、従来の方法を使用してメイン クラスを実行できるようになります。java -cp target/project-classes.jar 'com.mycompany.MainClass' param1 param2

于 2016-02-16T09:31:48.160 に答える
6

アーカイブ ファイル内でクラスを見つける規則は、ファイルのパッケージ宣言の場所とアーカイブ内のファイルの場所が一致する必要があるということです。クラスは WEB-INF/classes にあるため、現在のコンテキストで実行するにはクラスが有効ではないと考えられます。

あなたが求めていることを実行できる唯一の方法は、戦争を再パッケージ化して、.classファイルmypackageが WEB-INF/classes ディレクトリではなく、アーカイブのルートのディレクトリに存在するようにすることです。ただし、これを行うと、どの Web クラスからもファイルにアクセスできなくなります。

このクラスを war と Java コマンド ラインの外の両方で再利用する場合は、コマンド ラインから実行できる実行可能 jar を作成し、その jar をwarファイルの WEB-INF/lib ディレクトリに配置することを検討してください。

于 2009-12-03T21:24:48.640 に答える
5

Mavenプロジェクトでは、に設定することで、 Maven War プラグインを使用して jar を自動的にビルドできます。以下の例。archiveClassestrue

<plugin>
       <groupId>org.apache.maven.plugins</groupId>
       <artifactId>maven-war-plugin</artifactId>
       <configuration>
        <archiveClasses>true</archiveClasses>
       </configuration>
</plugin>
于 2011-04-20T11:47:06.480 に答える
0

ウィキペディアによると、WAR ファイルでは、クラスパスにロードされるクラスは "/WEB-INF/classes" および "/WEB-INF/lib" ディレクトリにあります。

クラスのコピーを単純に zip ファイルのルート ファイル システム (war/jar とは何か) に置くこともできます。それがうまくいくかどうかはわかりません。

いつでも 2 つの個別のファイルを作成できます。

于 2009-12-03T21:26:28.230 に答える
-3

WAR ファイルから Java クラスを実行することはできません。WAR ファイルは、Jar ファイルとは構造が異なります。

関連する Java クラスを見つけるには、Jar として Web アプリ ライブラリに配置するようにエクスポートします (ant を使用するための推奨される方法)。

その後、通常どおりjarファイルを使用してJavaプログラムを実行できます。Web アプリでも同じ jar が参照されました (この jar を Web アプリ lib に配置した場合)

于 2015-06-08T09:57:11.007 に答える