Extracting Tomcat Zip SOMETIMES fail with IOException: Negative seek offset
10,096
Solution 1
Usually it's due to a bad download (the odd corrupted packet etc). Try using an MD5 / SHA-1 checksum to validate the archive before using it.
Also be careful that the offset variable is large enough to hold the require value of your seek.
Solution 2
The Problem was gone after changing the download url to an mirror.
Author by
Ralph
Updated on June 07, 2022Comments
-
Ralph almost 2 years
I am using maven cargo with its zip url installer feature to download a tomcat for my integration tests. This works fine on my computer, but when its run in husdon it fails sometimes (round about 10-20%).
The failure is:
Error while expanding /home/hudson/workspace/My Test Media-Archive/cfma/target/cargo/install/apache-tomcat-6.0.32.zip java.io.IOException: Negative seek offset at org.apache.tools.ant.taskdefs.Expand.expandFile(Expand.java:148) at org.apache.tools.ant.taskdefs.Expand.execute(Expand.java:107) at org.codehaus.cargo.container.installer.ZipURLInstaller.unpack(ZipURLInstaller.java:252) at org.codehaus.cargo.container.installer.ZipURLInstaller.install(ZipURLInstaller.java:149) at org.codehaus.cargo.maven2.configuration.Container.setupHome(Container.java:357) at org.codehaus.cargo.maven2.configuration.Container.createContainer(Container.java:241) at org.codehaus.cargo.maven2.AbstractCargoMojo.createNewContainer(AbstractCargoMojo.java:470) at org.codehaus.cargo.maven2.AbstractCargoMojo.createContainer(AbstractCargoMojo.java:410) at org.codehaus.cargo.maven2.ContainerStartMojo.doExecute(ContainerStartMojo.java:53) at org.codehaus.cargo.maven2.AbstractCargoMojo.execute(AbstractCargoMojo.java:268) at org.apache.maven.plugin.DefaultPluginManager.executeMojo(DefaultPluginManager.java:490) at hudson.maven.agent.PluginManagerInterceptor.executeMojo(PluginManagerInterceptor.java:182) at org.apache.maven.lifecycle.DefaultLifecycleExecutor.executeGoals(DefaultLifecycleExecutor.java:694) at org.apache.maven.lifecycle.DefaultLifecycleExecutor.executeGoalWithLifecycle(DefaultLifecycleExecutor.java:556) at org.apache.maven.lifecycle.DefaultLifecycleExecutor.executeGoal(DefaultLifecycleExecutor.java:535) at org.apache.maven.lifecycle.DefaultLifecycleExecutor.executeGoalAndHandleFailures(DefaultLifecycleExecutor.java:387) at org.apache.maven.lifecycle.DefaultLifecycleExecutor.executeTaskSegments(DefaultLifecycleExecutor.java:348) at org.apache.maven.lifecycle.DefaultLifecycleExecutor.execute(DefaultLifecycleExecutor.java:180) at org.apache.maven.lifecycle.LifecycleExecutorInterceptor.execute(LifecycleExecutorInterceptor.java:65) at org.apache.maven.DefaultMaven.doExecute(DefaultMaven.java:328) at org.apache.maven.DefaultMaven.execute(DefaultMaven.java:138) at org.apache.maven.cli.MavenCli.main(MavenCli.java:362) 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.codehaus.classworlds.Launcher.launchEnhanced(Launcher.java:315) at org.codehaus.classworlds.Launcher.launch(Launcher.java:255) at hudson.maven.agent.Main.launch(Main.java:173) at hudson.maven.MavenBuilder.call(MavenBuilder.java:164) at hudson.maven.MavenModuleSetBuild$Builder.call(MavenModuleSetBuild.java:861) at hudson.maven.MavenModuleSetBuild$Builder.call(MavenModuleSetBuild.java:792) at hudson.remoting.UserRequest.perform(UserRequest.java:114) at hudson.remoting.UserRequest.perform(UserRequest.java:48) at hudson.remoting.Request$2.run(Request.java:270) at java.util.concurrent.Executors$RunnableAdapter.call(Executors.java:441) at java.util.concurrent.FutureTask$Sync.innerRun(FutureTask.java:303) at java.util.concurrent.FutureTask.run(FutureTask.java:138) at java.util.concurrent.ThreadPoolExecutor$Worker.runTask(ThreadPoolExecutor.java:886) at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:908) at java.lang.Thread.run(Thread.java:662) Caused by: java.io.IOException: Negative seek offset at java.io.RandomAccessFile.seek(Native Method) at org.apache.tools.zip.ZipFile.positionAtCentralDirectory(ZipFile.java:403) at org.apache.tools.zip.ZipFile.populateFromCentralDirectory(ZipFile.java:271) at org.apache.tools.zip.ZipFile.<init>(ZipFile.java:152) at org.apache.tools.ant.taskdefs.Expand.expandFile(Expand.java:137) ... 40 more --- Nested Exception --- java.io.IOException: Negative seek offset at java.io.RandomAccessFile.seek(Native Method) at org.apache.tools.zip.ZipFile.positionAtCentralDirectory(ZipFile.java:403) at org.apache.tools.zip.ZipFile.populateFromCentralDirectory(ZipFile.java:271) at org.apache.tools.zip.ZipFile.<init>(ZipFile.java:152) at org.apache.tools.ant.taskdefs.Expand.expandFile(Expand.java:137) at org.apache.tools.ant.taskdefs.Expand.execute(Expand.java:107) at org.codehaus.cargo.container.installer.ZipURLInstaller.unpack(ZipURLInstaller.java:252) at org.codehaus.cargo.container.installer.ZipURLInstaller.install(ZipURLInstaller.java:149) at org.codehaus.cargo.maven2.configuration.Container.setupHome(Container.java:357) at org.codehaus.cargo.maven2.configuration.Container.createContainer(Container.java:241) at org.codehaus.cargo.maven2.AbstractCargoMojo.createNewContainer(AbstractCargoMojo.java:470) at org.codehaus.cargo.maven2.AbstractCargoMojo.createContainer(AbstractCargoMojo.java:410) at org.codehaus.cargo.maven2.ContainerStartMojo.doExecute(ContainerStartMojo.java:53) at org.codehaus.cargo.maven2.AbstractCargoMojo.execute(AbstractCargoMojo.java:268) at org.apache.maven.plugin.DefaultPluginManager.executeMojo(DefaultPluginManager.java:490) at hudson.maven.agent.PluginManagerInterceptor.executeMojo(PluginManagerInterceptor.java:182) at org.apache.maven.lifecycle.DefaultLifecycleExecutor.executeGoals(DefaultLifecycleExecutor.java:694) at org.apache.maven.lifecycle.DefaultLifecycleExecutor.executeGoalWithLifecycle(DefaultLifecycleExecutor.java:556) at org.apache.maven.lifecycle.DefaultLifecycleExecutor.executeGoal(DefaultLifecycleExecutor.java:535) at org.apache.maven.lifecycle.DefaultLifecycleExecutor.executeGoalAndHandleFailures(DefaultLifecycleExecutor.java:387) at org.apache.maven.lifecycle.DefaultLifecycleExecutor.executeTaskSegments(DefaultLifecycleExecutor.java:348) at org.apache.maven.lifecycle.DefaultLifecycleExecutor.execute(DefaultLifecycleExecutor.java:180) at org.apache.maven.lifecycle.LifecycleExecutorInterceptor.execute(LifecycleExecutorInterceptor.java:65) at org.apache.maven.DefaultMaven.doExecute(DefaultMaven.java:328) at org.apache.maven.DefaultMaven.execute(DefaultMaven.java:138) at org.apache.maven.cli.MavenCli.main(MavenCli.java:362) 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.codehaus.classworlds.Launcher.launchEnhanced(Launcher.java:315) at org.codehaus.classworlds.Launcher.launch(Launcher.java:255) at hudson.maven.agent.Main.launch(Main.java:173) at hudson.maven.MavenBuilder.call(MavenBuilder.java:164) at hudson.maven.MavenModuleSetBuild$Builder.call(MavenModuleSetBuild.java:861) at hudson.maven.MavenModuleSetBuild$Builder.call(MavenModuleSetBuild.java:792) at hudson.remoting.UserRequest.perform(UserRequest.java:114) at hudson.remoting.UserRequest.perform(UserRequest.java:48) at hudson.remoting.Request$2.run(Request.java:270) at java.util.concurrent.Executors$RunnableAdapter.call(Executors.java:441) at java.util.concurrent.FutureTask$Sync.innerRun(FutureTask.java:303) at java.util.concurrent.FutureTask.run(FutureTask.java:138) at java.util.concurrent.ThreadPoolExecutor$Worker.runTask(ThreadPoolExecutor.java:886) at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:908) at java.lang.Thread.run(Thread.java:662)
And this is the relevant part of my pom.
<plugin> <groupId>org.codehaus.cargo</groupId> <artifactId>cargo-maven2-plugin</artifactId> <version>1.0.5</version> <configuration> <container> <zipUrlInstaller> <url>http://archive.apache.org/dist/tomcat/tomcat-6/v6.0.32/bin/apache-tomcat-6.0.32.zip</url> <zipUrlInstaller> .... </container> ... <configuration> </plugin>
Does anybody know what I am doing wrong?
-
Peter almost 13 yearsTCP should be resilient against dropped packets, surely? Only corrupted packets where the checksum verification gives a false positive should get through to the application performing the download. You could try writing a loop to wget the file and check its checksum
-
Michael almost 13 yearsTCP should be resilient using ACK, so yes, it is more likely that corrupted packets would be the issue.
-
Ralph almost 13 years@Mikaveli: because I undersand your answer in the way that it is an transport problem, and second it does not contain a solution, you say only I should check the file (but I know that it is corrupt). -- But on the other hand I can accept your answer, because mine is not a real answer to the problem too.
-
Michael almost 13 yearsThe point was, if you validated the file, you would have known whether the file was corrupt at source - or afterwards (whilst downloading / on disk etc). The final solution is determined by the result of that test. Switching the source has fixed it for you, but it's better to determine exactly where things went wrong, to protect yourself in the future. :)
-
Matt Ryall almost 11 yearsMore likely an aborted download or a broken Maven proxy or web server that served the Tomcat download. The chance of data being corrupted when sent over TCP is very small.