Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/355.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 为什么Tomcat为现有JAR文件抛出FileNotFoundException?_Java_Maven_Tomcat_Jar_Native - Fatal编程技术网

Java 为什么Tomcat为现有JAR文件抛出FileNotFoundException?

Java 为什么Tomcat为现有JAR文件抛出FileNotFoundException?,java,maven,tomcat,jar,native,Java,Maven,Tomcat,Jar,Native,我想知道是什么导致Tomcat或本机JavaZipFile.open 方法声明文件不存在,而实际上文件不存在?这 在过去的一个月里,我的一些工作一直受到阻碍。它是 尝试运行tomcat7 maven插件时发生。它很好用 在大多数机器上,包括我的(OSX),但在构建服务器上失败 (LINUX)和我同事的一个盒子(OSX,和我的型号一样的笔记本电脑)。 以下是在Maven构建中看到的错误: [INFO] --- tomcat7-maven-plugin:2.2:run (start-tomcat)

我想知道是什么导致Tomcat或本机Java
ZipFile.open
方法声明文件不存在,而实际上文件不存在?这 在过去的一个月里,我的一些工作一直受到阻碍。它是 尝试运行tomcat7 maven插件时发生。它很好用 在大多数机器上,包括我的(OSX),但在构建服务器上失败 (LINUX)和我同事的一个盒子(OSX,和我的型号一样的笔记本电脑)。 以下是在Maven构建中看到的错误:

[INFO] --- tomcat7-maven-plugin:2.2:run (start-tomcat) @ PROJECT ---
[INFO] Running war on http://localhost:8080/contentmain
[INFO] Using existing Tomcat server configuration at
/WORKSPACE/PROJECT/tomcat7
Feb 05, 2015 11:17:53 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:
/usr/java/packages/lib/amd64:/usr/lib64:/lib64:/lib:/usr/lib
Feb 05, 2015 11:17:54 PM org.apache.coyote.AbstractProtocol init
INFO: Initializing ProtocolHandler ["http-bio-8080"]
Feb 05, 2015 11:17:54 PM org.apache.coyote.AbstractProtocol init
INFO: Initializing ProtocolHandler ["ajp-bio-8009"]
Feb 05, 2015 11:17:54 PM org.apache.coyote.AbstractProtocol init
INFO: Initializing ProtocolHandler ["http-bio-8443"]
Feb 05, 2015 11:17:54 PM org.apache.catalina.startup.Catalina load
INFO: Initialization processed in 651 ms
Feb 05, 2015 11:17:54 PM org.apache.catalina.core.StandardService
startInternal
INFO: Starting service Catalina
Feb 05, 2015 11:17:54 PM org.apache.catalina.core.StandardEngine
startInternal
INFO: Starting Servlet Engine: Apache Tomcat/7.0.53
Feb 05, 2015 11:17:54 PM org.apache.tomcat.util.scan.StandardJarScanner
scan
WARNING: Failed to scan JAR
[file:/WORKSPACE/tomcat7/webapps/../../target/PROJECT/WEB-INF/lib/openws-1.
5.1.jar] from WEB-INF/lib
java.io.FileNotFoundException:
/WORKSPACE/PROJECT/tomcat7/webapps/../../target/PROJECT/WEB-INF/lib/openws-
1.5.1.jar (No such file or directory)
    at java.util.zip.ZipFile.open(Native Method)
    at java.util.zip.ZipFile.<init>(ZipFile.java:215)
    at java.util.zip.ZipFile.<init>(ZipFile.java:145)
    at java.util.jar.JarFile.<init>(JarFile.java:154)
    at java.util.jar.JarFile.<init>(JarFile.java:91)
    at sun.net.www.protocol.jar.URLJarFile.<init>(URLJarFile.java:93)
    at sun.net.www.protocol.jar.URLJarFile.getJarFile(URLJarFile.java:69)
    at sun.net.www.protocol.jar.JarFileFactory.get(JarFileFactory.java:99)
    at
sun.net.www.protocol.jar.JarURLConnection.connect(JarURLConnection.java:122
)
    at
sun.net.www.protocol.jar.JarURLConnection.getJarFile(JarURLConnection.java:
89)
    at org.apache.tomcat.util.scan.FileUrlJar.<init>(FileUrlJar.java:41)
    at org.apache.tomcat.util.scan.JarFactory.newInstance(JarFactory.java:34)
    at
org.apache.catalina.startup.ContextConfig$FragmentJarScannerCallback.scan(C
ontextConfig.java:2612)
    at
org.apache.tomcat.util.scan.StandardJarScanner.process(StandardJarScanner.j
ava:259)
    at
org.apache.tomcat.util.scan.StandardJarScanner.scan(StandardJarScanner.java
:178)
    at
org.apache.catalina.startup.ContextConfig.processJarsForWebFragments(Contex
tConfig.java:1868)
    at
org.apache.catalina.startup.ContextConfig.webConfig(ContextConfig.java:1256
)
    at
org.apache.catalina.startup.ContextConfig.configureStart(ContextConfig.java
:873)
    at
org.apache.catalina.startup.ContextConfig.lifecycleEvent(ContextConfig.java
:371)
    at
org.apache.catalina.util.LifecycleSupport.fireLifecycleEvent(LifecycleSuppo
rt.java:117)
    at
org.apache.catalina.util.LifecycleBase.fireLifecycleEvent(LifecycleBase.jav
a:90)
    at
org.apache.catalina.core.StandardContext.startInternal(StandardContext.java
:5355)
    at org.apache.catalina.util.LifecycleBase.start(LifecycleBase.java:150)
    at
org.apache.catalina.core.ContainerBase$StartChild.call(ContainerBase.java:1
559)
    at
org.apache.catalina.core.ContainerBase$StartChild.call(ContainerBase.java:1
549)
    at java.util.concurrent.FutureTask.run(FutureTask.java:262)
    at
java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1
145)
    at
java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:
615)
    at java.lang.Thread.run(Thread.java:745)
我可以确认所有“丢失的”JAR文件都立即存在 在调用本机
open
方法并引发异常之前 声称文件不在那里。这让我怀疑 JAR文件可能已损坏,因此我从中复制了一个失败的JAR文件 我的同事的机器,并执行了与我的本地副本的差异 在成功构建和执行之后。他们是一模一样的,所以 看来“腐败罐子”理论已经过时了

我还尝试了以下方法(没有成功):

  • 缩短使用的路径(我在某处读到可能有一个256 字符限制)
  • 将JAR文件移动到其他目录并更改Tomcat 配置以指向新位置(它们在资源和 我将它们移动到projectbase.dir)
  • 设置从Xmx256到Xmx4096的各种JVM堆大小(我读了一些 内存问题可能导致Tomcat声明文件丢失的帖子)
  • 删除我们通常用于webapp的permgen设置
  • 将“jarScanAllDirectories”选项设置为false或true tomcat7 maven插件
  • 下载tomcat maven插件的源代码(包括 tomcat7 maven插件),通过远程 调试器到Maven并逐步执行(一切似乎都是 在本机ZipFile.open调用之前完全相同)
  • 在构建中为Maven使用各种Jenkins作业设置 服务器(可能与此无关,因为这在同事的机器上也会失败 没有詹金斯的参与)
  • 将我们的webapp使用的所有环境变量与 由我的同事使用(它们完全相同)
  • 比较JDK版本(我们的整个组织在1.7.045上实现了标准化)
  • 比较Tomcat版本(我们对 7.0.53版上的tomcat7 maven插件)
  • 等待并希望问题自行解决
  • 让我所有的同事看一看(这导致我尝试了一些 尽管如此,但问题仍然没有得到解决)
我在这里束手无策。我已经熬夜好几天了 只是想让这件事正常运作。还有什么要看的

更新(2015年2月10日):有人建议,这是由于运行此操作的Jenkins计算机上缺少文件权限造成的。我没有访问发生这种情况的服务器的权限,但我确实获得了一个在那里运行的脚本:

echo Displaying JAR files with current permissions...
ls -la ./target/MyProject/WEB-INF/lib/

echo Adding read, write, and execute permissions to JAR files...
chmod -R 777 ./target/MyProject/WEB-INF/lib/

echo Displaying JAR files with updated permissions...
ls -la ./target/MyProject/WEB-INF/lib/
这将产生如下输出:

[INFO] --- exec-maven-plugin:1.3.2:exec (update_jar_file_permissions) @
MyProject ---
Displaying JAR files with current permissions...
total 124556
drwxr-xr-x 2 jenkins users    20480 Feb 10 17:26 .
drwxr-xr-x 6 jenkins users     4096 Feb 10 17:26 ..
-rw-r--r-- 1 jenkins users    62983 Jan 22 00:11 activation-1.1.jar
-rw-r--r-- 1 jenkins users   351656 Jan 22 00:25 amqp-client-3.1.3.jar
-rw-r--r-- 1 jenkins users    74080 Jan 22 00:25 annotations-2.0.0.jar
-rw-r--r-- 1 jenkins users   445288 Jan 22 00:25 antlr-2.7.7.jar
-rw-r--r-- 1 jenkins users   895124 Jan 22 00:25 antlr-3.2.jar

Adding read, write, and execute permissions to JAR files...
Displaying JAR files with updated permissions...
total 124556
drwxrwxrwx 2 jenkins users    20480 Feb 10 17:26 .
drwxr-xr-x 6 jenkins users     4096 Feb 10 17:26 ..
-rwxrwxrwx 1 jenkins users    62983 Jan 22 00:11 activation-1.1.jar
-rwxrwxrwx 1 jenkins users   351656 Jan 22 00:25 amqp-client-3.1.3.jar
-rwxrwxrwx 1 jenkins users    74080 Jan 22 00:25 annotations-2.0.0.jar
-rwxrwxrwx 1 jenkins users   445288 Jan 22 00:25 antlr-2.7.7.jar
-rwxrwxrwx 1 jenkins users   895124 Jan 22 00:25 antlr-3.2.jar
如您所见,缺少权限。然而,这并没有改变 解决了这个问题:

Feb 10, 2015 5:27:54 PM org.apache.tomcat.util.scan.StandardJarScanner scan
WARNING: Failed to scan JAR [file:/opt/jenkins/workspace/MY_JENKINS_JOB/tomcat7/webapps/../../target/MY_PROJECT/WEB-INF/lib/activation-1.1.jar] from WEB-INF/lib
java.io.FileNotFoundException: /opt/jenkins/workspace/MY_JENKINS_JOB/tomcat7/webapps/../../target/MY_PROJECT/WEB-INF/lib/activation-1.1.jar (No such file or directory)
at java.util.zip.ZipFile.open(Native Method)

该脚本在tomcat7 maven插件之前运行。权限应该已经到位,JAR文件应该是可提取的。我仍然不明白为什么这不起作用。

事实证明这根本不是权限问题。出于某种原因,将JAR文件从目录中复制出来并返回到目录中会导致它们被拾取(我在某个地方的建议中读到了这篇文章)。读取cp的“man”条目时,我发现它不会保留“访问控制列表(ACL)和扩展属性(EA),包括资源分叉”,除非设置了-p标志(使用mv时默认为打开)。我猜删除这些“访问控制”信息会让tomcat7 maven插件能够访问这些文件。这似乎有点粗略,我真的不知道问题的根本原因,但我很高兴它现在被修复


如果有人能明确解释为什么会这样,那么我会接受这个答案,而不是这个答案。

您的申请是否有权阅读这些罐子?是的,谢谢您的建议。请参阅我上面更新的问题。在Linux上,核心选项是在运行Tomcat的JVM进程上运行
strace
。这将让您确切地看到进程用来访问这些文件的系统调用,以及失败的原因。为什么要把它放在那里?我不知道为什么我的团队会把JAR文件放在那里,而不是放在web应用程序中?@EJP,但我们的应用程序配置为从这个目录中读取JAR文件。阿福那是个相当标准的位置。
Feb 10, 2015 5:27:54 PM org.apache.tomcat.util.scan.StandardJarScanner scan
WARNING: Failed to scan JAR [file:/opt/jenkins/workspace/MY_JENKINS_JOB/tomcat7/webapps/../../target/MY_PROJECT/WEB-INF/lib/activation-1.1.jar] from WEB-INF/lib
java.io.FileNotFoundException: /opt/jenkins/workspace/MY_JENKINS_JOB/tomcat7/webapps/../../target/MY_PROJECT/WEB-INF/lib/activation-1.1.jar (No such file or directory)
at java.util.zip.ZipFile.open(Native Method)