メインがある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、それが違いを生むはずだとは思わない。
Hudson (継続的統合プロジェクト)の機能を実行できます。 Tomcatにデプロイできる、または以下を使用して実行できる戦争をダウンロードします。
Java -jar hudson.war
(Jettyエンジンが組み込まれているため、コマンドラインから実行するとサーバーが起動します。)とにかくハドソンのマニフェストを見ると、アーカイブのルートにMainクラスを配置していることがわかります。あなたの場合、戦争のレイアウトは次のようになります。
ルートの下:
マニフェストには次の行を含める必要があります。
Main-Class: mypackage.MyEntryPointClass
mypackage/MyEntryPointClass.classはコマンドラインからのみアクセス可能であり、WEB-INF/classesの下のクラスはアプリケーションサーバーからのみアクセス可能であることに注意してください。
HTH
Richard Detschに似ていますが、少しわかりやすくなっています(パッケージでも動作します)
ステップ1:Warファイルを展開します。
jar -xvf MyWar.war
ステップ2:ディレクトリに移動する
cd WEB-INF
ステップ3:すべての依存関係でメインを実行する
Java -classpath "lib/*:classes/." my.packages.destination.FileToRun
戦争はウェブアプリです。 webappと同じクラスを再利用するコンソール/スタンドアロンアプリケーションが必要な場合は、WEB-INF/lib
に入れることができるjarに共有クラスをパッケージ化することを検討してください。次に、コマンドラインからそのjarを使用します。したがって、両方のコンソールアプリケーションを取得し、2つの異なるパッケージを作成せずに、サーブレットで同じクラスを使用できます。もちろん、これは戦争が爆発したときに当てはまります。
デプロイされた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による上記のコメントは正しいようです
アーカイブファイル内のクラスを見つける規則は、ファイルのパッケージ宣言の場所とアーカイブ内のファイルの場所を一致させる必要があるということです。クラスはWEB-INF/classesにあるため、クラスは現在のコンテキストで実行するのに有効ではないと考えます。
求めていることを実行できる唯一の方法は、戦争を再パッケージ化して.class
ファイルは、WEB-INF/classesディレクトリではなく、アーカイブのルートのmypackage
ディレクトリにあります。ただし、これを行うと、Webクラスからファイルにアクセスできなくなります。
Javaコマンドラインから戦争と外部の両方でこのクラスを再利用したい場合は、コマンドラインから実行できる実行可能jarを構築してから、そのjarをwar
ファイルのWEB-INF/libディレクトリ。
Maven プロジェクトでは、 Maven Warプラグイン を使用して、archiveClasses
をtrue
に設定することにより、jarを自動的にビルドできます。以下の例。
<plugin>
<groupId>org.Apache.maven.plugins</groupId>
<artifactId>maven-war-plugin</artifactId>
<configuration>
<archiveClasses>true</archiveClasses>
</configuration>
</plugin>
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
自体project-classes.jar
その後、古典的なメソッドを使用してメインクラスを実行できます:Java -cp target/project-classes.jar 'com.mycompany.MainClass' param1 param2
Wikipedia によると、WARファイルでは、クラスパスにロードされるクラスは「/ WEB-INF/classes」および「/ WEB-INF/lib」ディレクトリにあります。
クラスのコピーをZipファイルのルートファイルシステムに配置するだけで済みます(これはwar/jarです)。それがうまくいくかどうかはわかりません。
いつでも2つの個別のファイルを作成できます。