您的位置:首页 > 运维架构 > Tomcat

tomcat7源码编译过程以及问题解决

2014-10-12 20:57 1121 查看
   今天为了学习tomcat的核心源代码,下载了tomcat7的源代码进行编译,参考了网上的编译过程,但是在编译过程中遇到了问题,百度了一下,也没找到问题的解决方案,所以自己思考问题,经过一下午的思考,终于解决了tomcat源码的编译过程

  下面我把tomcat编译过程中遇到的问题以及解决方案列在下面,仅供参考

[javac] D:\Java\java×???\tomcat\basepath\tomcat6-deps\dbcp\src\java\org\apa

che\tomcat\dbcp\dbcp\BasicDataSource.java:44: 错误: BasicDataSource不是抽象的,

并且未覆盖CommonDataSource中的抽象方法getParentLogger()

    [javac] public class BasicDataSource implements DataSource {

    [javac]        ^

    [javac] D:\Java\java×???\tomcat\basepath\tomcat6-deps\dbcp\src\java\org\apa

che\tomcat\dbcp\dbcp\DelegatingStatement.java:46: 错误: DelegatingStatement不是

抽象的, 并且未覆盖Statement中的抽象方法isCloseOnCompletion()

    [javac] public class DelegatingStatement extends AbandonedTrace implements S

tatement {

    [javac]        ^

    [javac] D:\Java\java×???\tomcat\basepath\tomcat6-deps\dbcp\src\java\org\apa

che\tomcat\dbcp\dbcp\DelegatingStatement.java:131: 错误: DelegatingStatement中的

isClosed()无法实现Statement中的isClosed()

    [javac]     protected boolean isClosed() {

    [javac]                       ^

    [javac]   正在尝试分配更低的访问权限; 以前为public

    [javac] D:\Java\java×???\tomcat\basepath\tomcat6-deps\dbcp\src\java\org\apa

che\tomcat\dbcp\dbcp\DelegatingPreparedStatement.java:50: 错误: DelegatingPrepar

edStatement不是抽象的, 并且未覆盖PreparedStatement中的抽象方法setNClob(int,Reade

r)

    [javac] public class DelegatingPreparedStatement extends DelegatingStatement

    [javac]        ^

    [javac] D:\Java\java×???\tomcat\basepath\tomcat6-deps\dbcp\src\java\org\apa

che\tomcat\dbcp\dbcp\DelegatingCallableStatement.java:53: 错误: DelegatingCallab

leStatement不是抽象的, 并且未覆盖CallableStatement中的抽象方法<T>getObject(Strin

g,Class<T>)

    [javac] public class DelegatingCallableStatement extends DelegatingPreparedS

tatement

    [javac]        ^

    [javac]   其中, T是类型变量:

    [javac]     T扩展已在方法 <T>getObject(String,Class<T>)中声明的Object

    [javac] D:\Java\java×???\tomcat\basepath\tomcat6-deps\dbcp\src\java\org\apa

che\tomcat\dbcp\dbcp\DelegatingConnection.java:51: 错误: DelegatingConnection不

是抽象的, 并且未覆盖Connection中的抽象方法getNetworkTimeout()

    [javac] public class DelegatingConnection extends AbandonedTrace

    [javac]        ^

    [javac] D:\Java\java×???\tomcat\basepath\tomcat6-deps\dbcp\src\java\org\apa

che\tomcat\dbcp\dbcp\DelegatingResultSet.java:55: 错误: DelegatingResultSet不是

抽象的, 并且未覆盖ResultSet中的抽象方法<T>getObject(String,Class<T>)

    [javac] public class DelegatingResultSet extends AbandonedTrace implements R

esultSet {

    [javac]        ^

    [javac]   其中, T是类型变量:

    [javac]     T扩展已在方法 <T>getObject(String,Class<T>)中声明的Object

    [javac] D:\Java\java×???\tomcat\basepath\tomcat6-deps\dbcp\src\java\org\apa

che\tomcat\dbcp\dbcp\PoolablePreparedStatement.java:41: 错误: PoolablePreparedSt

atement不是抽象的, 并且未覆盖PreparedStatement中的抽象方法setNClob(int,Reader)

    [javac] public class PoolablePreparedStatement extends DelegatingPreparedSta

tement implements PreparedStatement {

    [javac]        ^

    [javac] D:\Java\java×???\tomcat\basepath\tomcat6-deps\dbcp\src\java\org\apa

che\tomcat\dbcp\dbcp\PoolingConnection.java:42: 错误: PoolingConnection不是抽象

的, 并且未覆盖Connection中的抽象方法getNetworkTimeout()

    [javac] public class PoolingConnection extends DelegatingConnection implemen

ts Connection, KeyedPoolableObjectFactory {

    [javac]        ^

    [javac] D:\Java\java×???\tomcat\basepath\tomcat6-deps\dbcp\src\java\org\apa

che\tomcat\dbcp\dbcp\PoolingDataSource.java:45: 错误: PoolingDataSource不是抽象

的, 并且未覆盖CommonDataSource中的抽象方法getParentLogger()

    [javac] public class PoolingDataSource implements DataSource {

    [javac]        ^

    [javac] D:\Java\java×???\tomcat\basepath\tomcat6-deps\dbcp\src\java\org\apa

che\tomcat\dbcp\dbcp\PoolingDriver.java:52: 错误: PoolingDriver不是抽象的, 并且

未覆盖Driver中的抽象方法getParentLogger()

    [javac] public class PoolingDriver implements Driver {

    [javac]        ^

    [javac] D:\Java\java×???\tomcat\basepath\tomcat6-deps\dbcp\src\java\org\apa

che\tomcat\dbcp\dbcp\cpdsadapter\ConnectionImpl.java:41: 错误: ConnectionImpl不

是抽象的, 并且未覆盖Connection中的抽象方法getNetworkTimeout()

    [javac] class ConnectionImpl implements Connection {

    [javac] ^

    [javac] D:\Java\java×???\tomcat\basepath\tomcat6-deps\dbcp\src\java\org\apa

che\tomcat\dbcp\dbcp\cpdsadapter\PooledConnectionImpl.java:43: 错误: PooledConne

ctionImpl不是抽象的, 并且未覆盖PooledConnection中的抽象方法removeStatementEventL

istener(StatementEventListener)

    [javac] class PooledConnectionImpl

    [javac] ^

    [javac] D:\Java\java×???\tomcat\basepath\tomcat6-deps\dbcp\src\java\org\apa

che\tomcat\dbcp\dbcp\cpdsadapter\DriverAdapterCPDS.java:86: 错误: DriverAdapterC

PDS不是抽象的, 并且未覆盖CommonDataSource中的抽象方法getParentLogger()

    [javac] public class DriverAdapterCPDS

    [javac]        ^

    [javac] D:\Java\java×???\tomcat\basepath\tomcat6-deps\dbcp\src\java\org\apa

che\tomcat\dbcp\dbcp\cpdsadapter\PoolablePreparedStatementStub.java:34: 错误: De

legatingStatement中的isClosed()无法实现Statement中的isClosed()

    [javac] class PoolablePreparedStatementStub extends PoolablePreparedStatemen

t {

    [javac] ^

    [javac]   正在尝试分配更低的访问权限; 以前为public

    [javac] D:\Java\java×???\tomcat\basepath\tomcat6-deps\dbcp\src\java\org\apa

che\tomcat\dbcp\dbcp\datasources\PerUserPoolDataSource.java:52: 错误: PerUserPoo

lDataSource不是抽象的, 并且未覆盖CommonDataSource中的抽象方法getParentLogger()

    [javac] public class PerUserPoolDataSource

    [javac]        ^

    [javac] D:\Java\java×???\tomcat\basepath\tomcat6-deps\dbcp\src\java\org\apa

che\tomcat\dbcp\dbcp\datasources\SharedPoolDataSource.java:45: 错误: SharedPoolD

ataSource不是抽象的, 并且未覆盖CommonDataSource中的抽象方法getParentLogger()

    [javac] public class SharedPoolDataSource

    [javac]        ^

    [javac] 注: 某些输入文件使用或覆盖了已过时的 API。

    [javac] 注: 有关详细信息, 请使用 -Xlint:deprecation 重新编译。

    [javac] 注: 某些输入文件使用了未经检查或不安全的操作。

    [javac] 注: 有关详细信息, 请使用 -Xlint:unchecked 重新编译。

    [javac] 17 个错误

    [javac] 1 个警告

    上面这个编译过程可以采取一下的方法解决:

    (1)下载dbcp的jar包   commons-dbcp-1.4
    (2)用360压缩打开该文件,将里面的class文件复制到一个目录下

    (3)修改build.xml文件,我采取的是

        在105行添加<property name="compiled-dbcp.home" value="${base.path}/compiled-dbcp" />

        修改<target name="build-tomcat-dbcp" depends="build-manifests" unless="no.build.dbcp">里面的内容

       将javac里面修改成<include name="**/org/apache/tomcat/dbcp/pool/*.java" />

       在javac下面添加

      <copy todir="${tomcat-dbcp.home}/classes/org/apache/tomcat/dbcp">

  <fileset dir="${compiled-dbcp.home}/classes/org/apache/commons" />

  </copy>

    大家看了上面的解决方案,意思就是不编译dbcp的源代码,只编译common-pool的源码,再将官网已经编译好的文件拷贝到class的对应位置,再打成jar包

这只是一种简单的解决方案,这部分源码对于研究tomcat的核心原理没有影响,姑且可以忽略之部分代码,只要编译通过tomcat源码即可

    
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息