web-dev-qa-db-ja.com

コマンドラインからWARでクラスを実行するにはどうすればよいですか?

メインがあるJavaクラスがあり、コマンドラインからスタンドアロンアプリとして実行するのに使用しました。

Java -jar myjar.jar params

Apacheで実行するにはコードを再パッケージする必要があり、古いjarのエントリポイントクラスを含むすべてのコードは、Webサーバーに簡単に展開できるように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、それが違いを生むはずだとは思わない。

63
Simon

Hudson (継続的統合プロジェクト)の機能を実行できます。 Tomcatにデプロイできる、または以下を使用して実行できる戦争をダウンロードします。

Java -jar hudson.war

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

ルートの下:

  • mypackage/MyEntryPointClass.class
  • WEB-INF/lib
  • WEB-INF/classes
  • META-INF/MANIFEST.MF

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

Main-Class: mypackage.MyEntryPointClass

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

HTH

36
Yonatan Maman

Richard Detschに似ていますが、少しわかりやすくなっています(パッケージでも動作します)

ステップ1:Warファイルを展開します。

jar -xvf MyWar.war

ステップ2:ディレクトリに移動する

cd WEB-INF

ステップ3:すべての依存関係でメインを実行する

Java -classpath "lib/*:classes/." my.packages.destination.FileToRun
29
Bojan Petkovic

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

10
Bozho

デプロイされたwarファイルからSomeClass.main(String [] args)を実行するには:

ステップ1: メインメソッドメソッド(つまり、public static void main(String [] args){...})を持つクラスSomeClass.Javaを記述します。

ステップ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' | jarfileを読み取り中; jar tf "$ jarfile"の場合| grep SomeOtherClass.class;次に、「$ jarfile」をエコーし​​ます。 fi;やった

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

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

8
Richard Detsch

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

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

Javaコマンドラインから戦争と外部の両方でこのクラスを再利用したい場合は、コマンドラインから実行できる実行可能jarを構築してから、そのjarをwarファイルのWEB-INF/libディレクトリ。

6
Jason Gritman

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

<plugin>
       <groupId>org.Apache.maven.plugins</groupId>
       <artifactId>maven-war-plugin</artifactId>
       <configuration>
        <archiveClasses>true</archiveClasses>
       </configuration>
</plugin>
4
marioosh

Mavenを使用している場合は、「 webappにクラスを含むJARを作成するにはどうすればよいですか? :add」に関する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自体
  • Jar内のすべてのコンパイル済みクラスを含むproject-classes.jar

その後、古典的なメソッドを使用してメインクラスを実行できます:Java -cp target/project-classes.jar 'com.mycompany.MainClass' param1 param2

3
Anthony O.

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

クラスのコピーをZipファイルのルートファイルシステムに配置するだけで済みます(これはwar/jarです)。それがうまくいくかどうかはわかりません。

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

0
Chad Okere