web-dev-qa-db-ja.com

Ant、Tomcatビルドエラー:Java.lang.NoClassDefFoundError:org / Apache / Tomcat / util / buf / B2CConverter

Tomcatバージョン:7.0.20

私は次のSpring MVCチュートリアルを進めようとしています: http://static.springsource.org/docs/Spring- MVC-step-by-step/part1.html

このチュートリアルでは、マネージャーを使用してTomcatにデプロイするためのantビルドスクリプトをセットアップします。ただし、Tomcatタスクを実行しようとすると、いくつかの問題が発生します。

最初に、チュートリアルでは、まだorg.Apache.catalina.ant.InstallTaskを使用していますが、これは廃止されているため、org.Apache.catalina.ant.DeployTaskに変更しました。

問題は、Tomcatタスクを実行しようとすると次のようになることです。

Java.lang.NoClassDefFoundError: org/Apache/Tomcat/util/buf/B2CConverter
    at org.Apache.catalina.util.Base64.encode(Base64.Java:177)
    at org.Apache.catalina.ant.AbstractCatalinaTask.execute(AbstractCatalinaTask.Java:204)
    at org.Apache.catalina.ant.AbstractCatalinaTask.execute(AbstractCatalinaTask.Java:150)
    at org.Apache.catalina.ant.ReloadTask.execute(ReloadTask.Java:45)
    at org.Apache.tools.ant.UnknownElement.execute(UnknownElement.Java:291)
    at Sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
    at Sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.Java:39)
    at Sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.Java:25)
    at Java.lang.reflect.Method.invoke(Method.Java:597)
    at org.Apache.tools.ant.dispatch.DispatchUtils.execute(DispatchUtils.Java:106)
    at org.Apache.tools.ant.Task.perform(Task.Java:348)
    at org.Apache.tools.ant.Target.execute(Target.Java:390)
    at org.Apache.tools.ant.Target.performTasks(Target.Java:411)
    at org.Apache.tools.ant.Project.executeSortedTargets(Project.Java:1399)
    at org.Apache.tools.ant.Project.executeTarget(Project.Java:1368)
    at org.Apache.tools.ant.helper.DefaultExecutor.executeTargets(DefaultExecutor.Java:41)
    at org.Apache.tools.ant.Project.executeTargets(Project.Java:1251)
    at org.Apache.tools.ant.Main.runBuild(Main.Java:809)
    at org.Apache.tools.ant.Main.startAnt(Main.Java:217)
    at org.Apache.tools.ant.launch.Launcher.run(Launcher.Java:280)
    at org.Apache.tools.ant.launch.Launcher.main(Launcher.Java:109)
 Caused by: Java.lang.ClassNotFoundException: org.Apache.Tomcat.util.buf.B2CConverter
    at Java.net.URLClassLoader$1.run(URLClassLoader.Java:202)
    at Java.security.AccessController.doPrivileged(Native Method)
    at Java.net.URLClassLoader.findClass(URLClassLoader.Java:190)
    at Java.lang.ClassLoader.loadClass(ClassLoader.Java:306)
    at Java.lang.ClassLoader.loadClass(ClassLoader.Java:247)
    ... 21 more

だから私は少し調べて、Tomcat-utils.jarがクラスパスにあるべきであるという情報を見つけたので、catalina-ant.jarでファイルセットに追加しましたが、明らかにorg.Apache.Tomcat.util.buf.B2CConverterクラスはそこにありません。

そこで、次にjar -tfを使用してjarの調査を開始し、クラスが含まれているかどうかを調べました。 Tomcat-coyote.jarにクラスがあることがわかりました。これをファイルセットに含めても、問題は解決しません。

誰にもアイデアはありますか?

32
Jason Turner

クラスパスを

<path id="catalina-ant-classpath">
    <!-- We need the Catalina jars for Tomcat -->
    <!--  * for other app servers - check the docs --> 
    <fileset dir="${appserver.lib}">
        <include name="catalina-ant.jar"/>
        <include name="Tomcat-coyote.jar"/>
        <include name="Tomcat-util.jar"/>
    </fileset>
    <fileset dir="${appserver.home}/bin">
                <include name="Tomcat-juli.jar"/>
    </fileset>
</path>
28
Aidan Skinner

ジェイソンのように、私はエイダンの答えを試しましたが、うまくいきませんでした。 Tomcat 7では、マネージャーインターフェイスが少し変更されました。 URLで/ manager/listを使用する代わりに、/ manager/text/listを使用する必要があります。そこで、build.xmlのリストタスクを次のように変更しました。

<target name="list" description="List Tomcat applications">
    <list url="${Tomcat.manager.url}/text"
             username="${Tomcat.manager.username}"
             password="${Tomcat.manager.password}"/>
</target>

また、この操作に対して適切な特権を持つように、管理ユーザーに「manager-script」ロールを追加する必要がありました。

  <role rolename="manager-gui"/>
  <role rolename="manager-script"/>
  <user username="admin" password="admin" roles="manager-gui,manager-script"/>
15
wholladay

同じチュートリアルに従うと、同じエラーが見つかりました。ターゲットが正しく実行されるように、3つの変更を行う必要がありました。

まず、build.xmlの「list」ターゲットを変更して、上記の/ textを追加します。

<target name="list" description="List Tomcat applications">
    <list url="${Tomcat.manager.url}/text"
          username="${Tomcat.manager.username}"
          password="${Tomcat.manager.password}"/>
</target>

次に、catalina antクラスパスを変更します。

<path id="catalina-ant-classpath">
    <fileset dir="${appserver.home}/lib">
        <include name="catalina-ant.jar"/>
        <include name="Tomcat-coyote.jar"/>
        <include name="Tomcat-util.jar"/>
    </fileset>
    <fileset dir="${appserver.home}/bin">
        <include name="Tomcat-juli.jar"/>
    </fileset>
</path>

そして最後に、これをTomcat-users.xmlファイルに追加します。

<role rolename="manager-script"/>
  <user username="Tomcat" password="s3cret" roles="manager-gui,Tomcat,manager-script"/>

そして、それは私のために働いた=)

12
Neets

すべてのantコマンドを機能させるために、build.xmlファイルで「リスト」ターゲットを定義するときにURLを変更する代わりに、build.propertiesファイルでマネージャーのURLを変更できます。

Tomcat.manager.url=http://localhost:8080/manager/text
3
Liz

これは私にとってはうまくいくようでした(Tomcat 7.0.21、OS X):

<path id="catalina-ant-classpath">
  <fileset dir="${Tomcat_dir}/lib">
    <include name="catalina-ant.jar"/>
    <include name="Tomcat-coyote.jar"/>
    <include name="Tomcat-util.jar"/>
  </fileset>
  <fileset dir="${Tomcat_dir}/bin">
    <include name="Tomcat-juli.jar"/>
  </fileset>
</path>
<taskdef name="deploy" classname="org.Apache.catalina.ant.DeployTask" classpathref="catalina-ant-classpath"/>
<taskdef name="undeploy" classname="org.Apache.catalina.ant.UndeployTask" classpathref="catalina-ant-classpath"/>
<taskdef name="list" classname="org.Apache.catalina.ant.ListTask" classpathref="catalina-ant-classpath"/>
3
napu

また、Tomcat 7向けのCatalina-Antの記事もご覧ください。

http://paulgrenyer.blogspot.co.uk/2011/11/catalina-ant-for-Tomcat-7.html

2
Paul Grenyer

私のために働いたのは、ビルドパスに4つのjarファイルを追加することでした

実行->構成の実行->プログラムの選択、右側の[クラスパス]タブの選択、[ユーザーエントリ]をクリックし、Tomcatディレクトリから外部4 jarを追加します。

この後、私のbuild.xmlは以前のように実行されます

1
Alfus yang

他の答えはどれも私にとってはうまくいきません。代わりに、Tomcat_HOME/lib/catalina-ant.jar、Tomcat_HOME/lib/Tomcat-coyote.jar、Tomcat_HOME/lib/Tomcat-util.jar、Tomcat_HOME/bin/Tomcat-juli.jarをANT_HOME/libディレクトリにコピーしました。

Classpathrefにこれらのファイルが適切に含まれていないようです。

1

上記の変更を行い、「ant list」を実行した後、Java.io.FileNotFoundException:..../manager/text/list "としてエラーが発生しました。Eclipseを使用せずにTomcatをインストールディレクトリから起動することで解決しましたTomcatを起動した後、最初にブラウザで「localhost:8080」を試してください。これにより、tomcatsページが表示されるはずです。次に「ant list」を実行してみてください。

0
2ab

三つの事-

  • Tomcat 7.xを使用している場合catalina-ant-classpathのファイルセットを変更する

    <path id="catalina-ant-classpath">
        <!-- We need the Catalina jars for Tomcat -->
        <!--  * for other app servers - check the docs -->
        <fileset dir="${appserver.lib}">
            <include name="catalina-ant.jar"/>
        <include name="Tomcat-coyote.jar"/>
        <include name="Tomcat-util.jar"/>
      </fileset>
      <fileset dir="${appserver.home}/bin">
        <include name="Tomcat-juli.jar"/>
      </fileset>        
    
  • tomcat-users.xmlのユーザーを変更して、manager-scriptとしてのユーザー権限を付与します

  • Tomcat.manager.urlプロパティをhttp://localhost:8080/manager/textに変更します
0
Mad Scientist

私はSpringを初めて使用するか、Tomcatに初めて使用します.build.xmlのサブセクションTomcatタスクに(すべてのTomcatタスクで)クラスパスを追加しようとしていますが、なぜ機能しませんか?.

<taskdef name="deploy" classname="org.Apache.catalina.ant.DeployTask">
    <classpath>
        <path location="${appserver.home}/lib/catalina-ant.jar"/>
        <path location="${appserver.home}/lib/Tomcat-coyote.jar"/>
        <path location="${appserver.home}/lib/Tomcat-util.jar"/>
        <path location="${appserver.home}/bin/Tomcat-juli.jar"/>
    </classpath>
</taskdef>
0
Somy A

私はMac OS Xを使用しています。

<!-- ============================================================== -->
<!-- Tomcat tasks - remove these if you don't have Tomcat installed -->
<!-- ============================================================== -->

    <path id="catalina-ant-classpath">
        <!-- We need the Catalina jars for Tomcat -->
        <!--  * for other app servers - check the docs -->
        <fileset dir="${appserver.lib}">
            <include name="catalina-ant.jar"/>
        <include name="Tomcat-coyote.jar"/>
        <include name="Tomcat-util.jar"/>
      </fileset>
      <fileset dir="${appserver.home}/bin">
        <include name="Tomcat-juli.jar"/>
      </fileset>        
    </path>
0
Manu

三つの事-

Tomcat 7.xを使用している場合catalina-ant-classpathのファイルセットを変更する

    <path id="catalina-ant-classpath">
    <fileset dir="${appserver.lib}">
        <include name="catalina-ant.jar"/>
    <include name="Tomcat-coyote.jar"/>
    <include name="Tomcat-util.jar"/>
  </fileset>
  <fileset dir="${appserver.home}/bin">
    <include name="Tomcat-juli.jar"/>
  </fileset> 
</path> 

tomcat-users.xmlのユーザーを変更して、manager-scriptとしてのユーザー権限を付与します

Tomcat.manager.urlプロパティをhttp://localhost:8080/manager/textに変更します

0
Mad Scientist

catalina-ant.jarディレクトリからTomcat-coyote.jarディレクトリにTomcat-util.jarTomcat_home/lib/およびant_home/lib/を追加するだけです。

0

なぜこれが起こっているのか分かりませんが、回避策があります: http://www.coderanch.com/t/553582/Tomcat/Java-lang-NoClassDefFoundError-org-Apache

私は解決策を探しています。それが得られたら、ここに投稿することを忘れないようにします。

Opensuseを使用します。

0
Krystian

以前の回答を少し修正することをお勧めします。

ユーザーがmanager-guiとmanager-scriptの両方の役割を持つように構成することは、Tomcat 7のドキュメント 1 で強く推奨されていません。サイトをCSRF攻撃にさらす可能性があります。

ロールごとに異なるパスワードを持つ個別のユーザーを定義する方が安全です。

<role rolename="manager-"/>
<role rolename="manager-script"/>
<user username="admin-gui" password="s3cret1" roles="manager-gui"/>
<user username="admin-script" password="s3cret2" roles="manager-script"/>

一般に、GUIユーザーのユーザー名とパスワードを記憶するだけでよいので、より安全な構成が必要です。

0
user3051600