【问题标题】:java.io.FileNotFoundException: C:\Program Files\Apache Software Foundation\Tomcat 7.0\logs\localhost_access_log.2012-07-12.txt (Access is denied)java.io.FileNotFoundException: C:\Program Files\Apache Software Foundation\Tomcat 7.0\logs\localhost_access_log.2012-07-12.txt(访问被拒绝)
【发布时间】:2012-07-12 19:23:36
【问题描述】:

我正在尝试通过在 Tomcat 上运行我的 servlet 来测试它。但是,我收到上述错误(有时会发生此错误,但之前 servlet 运行良好)。几个事实:

  1. 我已经彻底查看了this similar problem 以及herehere 给出的解释

  2. 当我尝试重新启动 Tomcat(从 Eclipse 的“服务器”选项卡中)时,我从控制台收到一些错误日志:

“严重:无法打开访问日志文件 [~\Tomcat 7.0\logs\localhost_access_log.2012-07-12.txt]”,在日志输出的最后,有“INFO: SessionListener: sessionDestroyed(' E9A6117FDF54752D80A1B9B72F2B83D3') -- 在本文底部查看更多信息

  1. 我在“C:\Program Files\Apache Software Foundation\Tomcat 7.0\logs”查看了我的日志文件,没有与上面第 (2) 项中的内容相似的文件

  2. 我通过 Eclipse“部署”我的应用程序(即在开发过程中,我依赖 Eclipse 来启动 Tomcat),只有当我通过复制相应的 java 类获得项目的稳定版本时才进行真正的部署将文件放入 Tomcat 的 /webapps/WEB-INF/classes 文件夹并重新启动 Tomcat

最重要的是, 5. 在浏览器中输入“http://localhost:8080”会导致我进入 Tomcat 主页(所以我很确定服务器正在运行),而在浏览器中输入“http://localhost:8080/MyProjectName/MyServlet”会导致显示此问题标题的错误。

有什么想法/帮助吗? 非常感谢!

在此处查看更多错误日志

>!Jul 12, 2012 6:18:18 PM org.apache.catalina.core.AprLifecycleListener init
INFO: The APR based Apache Tomcat Native library which allows optimal performance in production environments was not found on the java.library.path: C:\Program Files\Java\jdk1.7.0\jre\bin;C:\Windows\Sun\Java\bin;C:\Windows\system32;C:\Windows;C:/Program Files/Java/jre7/bin/client;C:/Program Files/Java/jre7/bin;C:/Program Files/Java/jre7/lib/i386;C:\Users\Kiptoo\introcs\java\bin;C:\Windows\system32;C:\Windows;C:\Windows\system32\wbem;C:\Program Files\MiKTeX 2.8\miktex\bin;C:\Windows\System32\WindowsPowerShell\v1.0;C:\Program Files\Matlab\R2010a\runtime\win32;C:\Program Files\Matlab\R2010a\bin;C:\Program Files\TortoiseSVN\bin;C:\Program Files\QuickTime\QTSystem;C:\Users\Kiptoo\introcs\bin;C:\Users\Kiptoo\introcs\java\bin;C:\Python27;C:\Program Files\Eclipse;;.
Jul 12, 2012 6:18:20 PM org.apache.coyote.AbstractProtocol init
INFO: Initializing ProtocolHandler ["http-bio-8080"]
Jul 12, 2012 6:18:20 PM org.apache.coyote.AbstractProtocol init
INFO: Initializing ProtocolHandler ["ajp-bio-8009"]
Jul 12, 2012 6:18:20 PM org.apache.catalina.startup.Catalina load
INFO: Initialization processed in 2050 ms
Jul 12, 2012 6:18:20 PM org.apache.catalina.core.StandardService startInternal
INFO: Starting service Catalina
Jul 12, 2012 6:18:20 PM org.apache.catalina.core.StandardEngine startInternal
INFO: Starting Servlet Engine: Apache Tomcat/7.0.25
Jul 12, 2012 6:18:20 PM org.apache.catalina.valves.AccessLogValve open
SEVERE: Failed to open access log file [C:\Program Files\Apache Software Foundation\Tomcat 7.0\logs\localhost_access_log.2012-07-12.txt]
java.io.FileNotFoundException: C:\Program Files\Apache Software Foundation\Tomcat 7.0\logs\localhost_access_log.2012-07-12.txt (Access is denied)
    at java.io.FileOutputStream.open(Native Method)
    at java.io.FileOutputStream.<init>(FileOutputStream.java:212)
    at org.apache.catalina.valves.AccessLogValve.open(AccessLogValve.java:1115)
    at org.apache.catalina.valves.AccessLogValve.startInternal(AccessLogValve.java:1222)
    at org.apache.catalina.util.LifecycleBase.start(LifecycleBase.java:150)
    at org.apache.catalina.core.StandardPipeline.startInternal(StandardPipeline.java:185)
    at org.apache.catalina.util.LifecycleBase.start(LifecycleBase.java:150)
    at org.apache.catalina.core.ContainerBase.startInternal(ContainerBase.java:1144)
    at org.apache.catalina.core.StandardHost.startInternal(StandardHost.java:782)
    at org.apache.catalina.util.LifecycleBase.start(LifecycleBase.java:150)
    at org.apache.catalina.core.ContainerBase$StartChild.call(ContainerBase.java:1568)
    at org.apache.catalina.core.ContainerBase$StartChild.call(ContainerBase.java:1558)
    at java.util.concurrent.FutureTask$Sync.innerRun(FutureTask.java:334)
    at java.util.concurrent.FutureTask.run(FutureTask.java:166)
    at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1110)
    at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:603)
    at java.lang.Thread.run(Thread.java:722)

Jul 12, 2012 6:18:20 PM org.apache.catalina.startup.HostConfig deployDirectory
INFO: Deploying web application directory C:\Program Files\Apache Software Foundation\Tomcat 7.0\webapps\AndroidTest
Jul 12, 2012 6:18:20 PM org.apache.catalina.core.StandardContext postWorkDirectory
WARNING: Failed to create work directory [C:\Program Files\Apache Software Foundation\Tomcat 7.0\work\Catalina\localhost\AndroidTest] for context [/AndroidTest]
Jul 12, 2012 6:18:21 PM org.apache.catalina.util.SessionIdGenerator createSecureRandom
INFO: Creation of SecureRandom instance for session ID generation using [SHA1PRNG] took [175] milliseconds.
Jul 12, 2012 6:18:21 PM org.apache.jasper.EmbeddedServletOptions <init>
SEVERE: The scratchDir you specified: C:\Program Files\Apache Software Foundation\Tomcat 7.0\work\Catalina\localhost\AndroidTest is unusable.
Jul 12, 2012 6:18:21 PM org.apache.catalina.startup.HostConfig deployDirectory
INFO: Deploying web application directory C:\Program Files\Apache Software Foundation\Tomcat 7.0\webapps\docs
Jul 12, 2012 6:18:21 PM org.apache.catalina.startup.HostConfig deployDirectory
INFO: Deploying web application directory C:\Program Files\Apache Software Foundation\Tomcat 7.0\webapps\examples
Jul 12, 2012 6:18:21 PM org.apache.catalina.core.ApplicationContext log
INFO: ContextListener: contextInitialized()
Jul 12, 2012 6:18:21 PM org.apache.catalina.core.ApplicationContext log
INFO: SessionListener: contextInitialized()
Jul 12, 2012 6:18:21 PM org.apache.catalina.core.ApplicationContext log
INFO: ContextListener: attributeAdded('org.apache.jasper.compiler.TldLocationsCache', 'org.apache.jasper.compiler.TldLocationsCache@ff8399')
Jul 12, 2012 6:18:21 PM org.apache.catalina.startup.HostConfig deployDirectory
INFO: Deploying web application directory C:\Program Files\Apache Software Foundation\Tomcat 7.0\webapps\host-manager
Jul 12, 2012 6:18:22 PM org.apache.catalina.startup.HostConfig deployDirectory
INFO: Deploying web application directory C:\Program Files\Apache Software Foundation\Tomcat 7.0\webapps\manager
Jul 12, 2012 6:18:22 PM org.apache.catalina.startup.HostConfig deployDirectory
INFO: Deploying web application directory C:\Program Files\Apache Software Foundation\Tomcat 7.0\webapps\ROOT
Jul 12, 2012 6:18:22 PM org.apache.coyote.AbstractProtocol start
INFO: Starting ProtocolHandler ["http-bio-8080"]
Jul 12, 2012 6:18:22 PM org.apache.coyote.AbstractProtocol start
INFO: Starting ProtocolHandler ["ajp-bio-8009"]
Jul 12, 2012 6:18:22 PM org.apache.catalina.startup.Catalina start
INFO: Server startup in 2225 ms
Jul 12, 2012 6:19:22 PM org.apache.catalina.core.ApplicationContext log
INFO: SessionListener: sessionDestroyed('E9A6117FDF54752D80A1B9B72F2B83D3')

【问题讨论】:

  • 首先-“C:\Program Files\Apache Software Foundation\Tomcat 7.0\logs\localhost_access_log.2012-07-12.txt”真的存在吗?第二-如果访问被拒绝,您是否是拥有该文件夹属性的管理员第三-该文件是否可能正在被另一个人访问
  • @SeanF,该文件不存在。我在某处读到 Tomcat 会自动创建它。至少从早期的经验来看,我不记得曾经创建过那个文件。是的,我确实是管理员
  • 如果它不存在就创建它,您是否尝试过在该文件夹中手动添加某些内容以 100% 确保您在该文件夹中拥有权限

标签: eclipse tomcat servlets


【解决方案1】:

只有当我有一个稳定版本的项目时才进行真正的部署,方法是将适当的 java 类文件复制到 Tomcat 的 /webapps/WEB-INF/classes 文件夹并重新启动 Tomcat

停在那里:你永远不应该将任何文件放入webapps/WEB-INF 并期望它会带来任何好处。使用广为接受的打包方式(例如 WAR 文件或分解的 WAR 结构)将您的 webapp 正确部署到 webapps 目录中。

第二,问题很明显:java.io.FileNotFoundException: C:\Program Files\Apache Software Foundation\Tomcat 7.0\logs\localhost_access_log.2012-07-12.txt (Access is denied)。您的 Tomcat 无法写入该文件。仅仅因为您是管理员并不意味着 Tomcat 可以写入该目录:据我所知,Tomcat 不能很好地与 UAC 配合使用,而您正在尝试写入 Program Files,这通常需要一些丑陋的 UI 凭据条目破解。

因此,请检查您的文件(和目录)权限。检查Tomcat进程的uid:确保它们都是好的。最后,考虑使用CATALINA_HOMECATALINA_BASE(阅读文档了解如何操作)来解决您的所有权限问题。

【讨论】:

  • 在部署时,我按照 tomcat.apache.org/tomcat-7.0-doc/appdev/deployment.html 中的说明进行操作,其中包括修改 /WEB-INF 的选项,请参阅标题为“标准目录布局”的部分权限:我使用的是 Windows,但我不是确定在哪里检查进程的 uid(任务管理器显示 Tomcat 进程已停止,但自从从浏览器调用 localhost:8080 后它正在运行)。我不再看到 FileNotFoundException,但控制台日志和以前一样。另外,文档的哪个特定部分永久解释了权限问题?
  • 你误解了我对webapps/WEB-INF 的评论:Tomcat 的webapps 目录很特别,因为在默认配置下,那里的每个目录都被视为自动部署的webapp。如果你的 webapp 被称为“foo”并且应该在 /foo 上可用,那么它应该在 webapps/foo 并且你应该有 webapps/foo/WEB-INF 等等。如果你希望你的 webapp 成为“root”上下文,你需要改为将目录命名为 ROOT。如果您想使用 WAR 文件而不是分解的 WAR 目录(例如 foo.warROOT.war -- 区分大小写),所有这些都同样有效。
  • 您必须检查您的操作系统版本的文档以确定如何识别进程所有者以及设置他们的访问权限。我不是 Microsoft Windows 管理员,因此无法为您提供帮助。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2011-05-15
  • 2015-08-14
  • 1970-01-01
  • 1970-01-01
  • 2016-11-12
相关资源
最近更新 更多