web-dev-qa-db-ja.com

WindowsでFramework2ステージタスクを再生します。「入力行が長すぎます」

stage 」タスクを使用してWindows Server Server 2012で2つのアプリケーションを再生しようとしています。これをサービスにまとめて、サーバーの再起動時にアプリケーションが自動的に実行されるようにすることを目的としています。ただし、アプリを実行すると、次のメッセージが表示されます。

The input line is too long.
The syntax of the command is incorrect.

これは、Windowsのコマンドライン命令の文字数が 8000文字以内 であるためですが、クラスパスを引数として渡すことで、Playステージコマンドがこれを超えているようです。

「stage」フォルダをc:\mightにコピーすると、問題が修正されます(クラスパスのサイズが小さくなるため)が、そうなることを期待していました。よりエレガントなソリューションになります。

誰かがこれを回避する方法を見つけましたか?または、サーバーの再起動時に自動的に実行されるように、WindowsでPlayアプリケーションを実行するための提案がありますか。

ありがとう。

24
Ian

更新:sbtネイティブパッケージャーには、これに対する多くの組み込みソリューションが付属しています。以下のNieMaszNicの回答を参照してください。

これは既知の問題であり、SBTネイティブパッケージャー(開始スクリプトを生成する)で追跡されています。

https://github.com/sbt/sbt-native-packager/issues/72

この問題を回避するための私の推奨事項は、ワイルドカードクラスパスマッチャーを使用する独自の開始バッチスクリプトを作成することです。このスクリプトは、Playプロジェクトのdistディレクトリに置くことができ、最終的にはアプリケーションにパッケージ化されます。そのスクリプトは次のようになります。

Java %1 -cp "./lib/*;" play.core.server.NettyServer .

ワイルドカードクラスパスマッチャーを使用する場合、クラスパスの順序が開発モードと同じであることに依存できなくなることに注意してください。とにかくクラスパスの順序に依存するべきではありませんが、人々は必然的に依存します。

19
James Roper

私も同じ問題を抱えていて、あなたが提供した解決策に満足していませんでした。

もっと簡単な解決策を見つけました。

Build.sbtファイルに次の行を追加します

lazy val root = (project in file(".")).enablePlugins(PlayScala, LauncherJarPlugin)

ここで、次を使用して本番アプリケーションを生成する場合:

sbt dist

またはで本番モードを実行します

sbt start

LauncherJarPluginプラグインは、適切なbash /バッチ実行スクリプトの生成を処理します。

LauncherJarPluginの詳細については、次のドキュメントをお読みください。

長いクラスパスに関するSbtドキュメント

ビルドsbtでプラグインを有効にする方法

20
NieMaszNic

Jamesの提案を考慮に入れると、次のソリューションはPlay2アプリケーションで機能します。

  • アプリにCDを挿入し、play clean stageを実行します
  • [your_app]/target/universal/stage/bin/[YOUR_APP] .bat[your_app]/distにコピーします(「dist」ディレクトリを作成する必要がある場合があります) 。わかりやすくするために、ファイルの名前を[your_app] _windows.batに変更しましたが、名前は重要ではありません。 「dist」ディレクトリ内のファイルは、次にステージタスクを実行するときにアプリと一緒にコピーされます(Jamesに感謝)。
  • 新しいbatファイルをテキストエディタで開きます。
  • 「dist」ディレクトリに配置されたファイルは「universal」ディレクトリ(「bin」ではなく)に配置されるため、ホーム変数を変更する必要があります。つまり、最後の2つのピリオドを削除して、に移動しないようにします。親ディレクトリ(現在11行目)、例:.

    if "%WEB_PORTAL_HOME%"=="" set "WEB_PORTAL_HOME=%~dp0\\.."

なる:

if "%WEB_PORTAL_HOME%"=="" set "WEB_PORTAL_HOME=%~dp0"
  • 次に、Jamesの指示に従って、すべてのJARファイルを明示的にリストするのではなくワイルドカードを使用するようにクラスパスを変更する必要があります(現時点ではこれは91行目です)。

    set "APP_CLASSPATH=%APP_LIB_DIR%\web-portal.web-portal-1.0-SNAPSHOT.jar;%APP_LIB_DIR%\commons-c.....

なる:

set "APP_CLASSPATH=%APP_LIB_DIR%\web-portal.web-portal-1.0-SNAPSHOT.jar;%APP_LIB_DIR%\\*"
  • 次に、新しいスクリプトを実行できます(これは、[your_app]/target/stage/Universalディレクトリにコピーされます)。

重要:アップグレードするたびにこのファイルを再作成することをお勧めします

将来のリリースでビルドスクリプトが変更された場合に備えて再生してください。

11
Ian

Batファイルの最長行を次のように変更します。

set "APP_CLASSPATH=%APP_LIB_DIR%\..\conf\;%APP_LIB_DIR%\ *"
set "APP_MAIN_CLASS=play.core.server.ProdServerStart"
2
Mrc Bdl

最初にLauncherJarPluginを有効にする

lazy val root = (project in file(".")).enablePlugins(PlayJava, PlayEbean, LauncherJarPlugin)

次に、プロダクションモードでプレイを開始したい場合は、アクティベーターを使用できます。

activator clean compile stage testProd 

または高速バージョン:

activator testProd

これは本番モードで再生を実行します。コマンドにstageを追加する必要があるかどうかはわかりません。これは、すでにtestProdでビルドされていると確信しているためですが、確認することをお勧めします。ステージバージョンを構築しました。

0
Al-Mothafar