sonatype / nexus-public

Sonatype Nexus Repository Open-source codebase mirror
https://www.sonatype.com/products/repository-oss-download
Eclipse Public License 1.0
1.84k stars 557 forks source link

Some items cannot be retrieved by proxy in the p2 repository #350

Open tkyggit opened 4 months ago

tkyggit commented 4 months ago

Create URL in p2 repository with the following specification

URL:http://download.eclipse.org/technology/m2e/releases/latest/

setup eclipse, and update via plugin. but some jar cannot download.

plugins/org.mortbay.jasper.apache-jsp_9.0.83.jar is working, but org.mortbay.jasper.apache-el_9.0.83.jar is not working due to following error.

com.sonatype.nexus.repository.p2.orient.internal.proxy.OrientP2ProxyFacet - Exception java.io.IOException: invalid manifest format checking remote for update, proxy repo p2-m2eclipse-latest failed to fetch http://download.eclipse.org/technology/m2e/releases/latest/plugins/org.mortbay.jasper.apache-el_9.0.83.jar, content not in cache.

what is 'invalid manifest format ' and how can I resolve this ?

sewe commented 3 months ago

I also encountered this issue (on the same artifiact, only obtained via https://download.eclipse.org/releases/2024-03/).

Adding a com.sonatype.nexus.repository logger (at TRACE) level unfortunately didn't yield a more helpful log message:

2024-03-21 13:11:48,048+0100 WARN  [qtp1157497352-45492]  *UNKNOWN com.sonatype.nexus.repository.p2.orient.internal.proxy.OrientP2ProxyFacet
- Exception java.io.IOException: invalid manifest format checking remote for update, proxy repo p2-eclipse-simrel-2024-03 failed to fetch https://download.eclipse.org/releases/2024-03/202403131000/plugins/org.mortbay.jasper.apache-el_9.0.83.jar, content not in cache.

As this ticket is labelled help wanted, @mrprescott, is there anything else I can do to help debug this? Unfortunately, I cannot even find the code of the nexus p2 plugin (bundle com.sonatype.nexus.plugins:nexus-repository-p2) anymore, so it is really hard to determine how the manifest format is actually checked. (Cursory inspection of the file in question didn't turn up anything unusual; just the Maven bundle plug-in doing its work.)

Liam-Jackson-QAS commented 2 months ago

Hi, We are also hitting a similar issue in Nexus 3.67.1, this is not an issue in the last version of nexus 2 with it's p2 plugin. Strict Content type validation has been turned off.

The jar URL listed in this stack trace is publicly accessible. The repo mirrored is https://download.eclipse.org/releases/neon/201703231000/

2024-04-24 14:07:06,205+0000 WARN  [qtp2132960782-76]  *UNKNOWN com.sonatype.nexus.repository.p2.orient.internal.proxy.OrientP2ProxyFacet - Exception java.io.IOException: invalid header field checking remote for update, proxy repo neon-releases failed to fetch https://download.eclipse.org/releases/neon/201703231000/plugins/javax.wsdl_1.5.1.v201012040544.jar, content not in cache.
java.io.IOException: invalid header field
    at java.util.jar.Attributes.read(Attributes.java:404)
    at java.util.jar.Manifest.read(Manifest.java:234)
    at java.util.jar.Manifest.<init>(Manifest.java:81)
    at java.util.jar.Manifest.<init>(Manifest.java:73)
    at com.sonatype.nexus.repository.p2.internal.util.AttributesParserManifest$1.createSpecificEntity(AttributesParserManifest.java:56)
    at com.sonatype.nexus.repository.p2.internal.util.AttributesParserManifest$1.createSpecificEntity(AttributesParserManifest.java:1)
    at com.sonatype.nexus.repository.p2.internal.util.JarExtractor.getSpecificEntity(JarExtractor.java:42)
    at com.sonatype.nexus.repository.p2.internal.util.AttributesParserManifest.getAttributesFromBlob(AttributesParserManifest.java:67)
    at com.sonatype.nexus.repository.p2.util.P2TempBlobUtils.loadAttributesFrom(P2TempBlobUtils.java:59)
    at com.sonatype.nexus.repository.p2.util.P2TempBlobUtils.mergeAttributesFromTempBlob(P2TempBlobUtils.java:76)
    at com.sonatype.nexus.repository.p2.orient.internal.proxy.OrientP2ProxyFacet.doPutComponent(OrientP2ProxyFacet.java:263)
    at com.sonatype.nexus.repository.p2.orient.internal.proxy.OrientP2ProxyFacet.putComponent(OrientP2ProxyFacet.java:253)
    at org.sonatype.nexus.transaction.TransactionalWrapper.proceedWithTransaction(TransactionalWrapper.java:58)
    at org.sonatype.nexus.transaction.TransactionInterceptor.proceedWithTransaction(TransactionInterceptor.java:66)
    at org.sonatype.nexus.transaction.TransactionInterceptor.invoke(TransactionInterceptor.java:55)
    at com.sonatype.nexus.repository.p2.orient.internal.proxy.OrientP2ProxyFacet.store(OrientP2ProxyFacet.java:139)
    at org.sonatype.nexus.repository.proxy.ProxyFacetSupport.doGet(ProxyFacetSupport.java:320)
    at org.sonatype.nexus.repository.proxy.ProxyFacetSupport.lambda$1(ProxyFacetSupport.java:285)
    at org.sonatype.nexus.common.cooperation2.internal.orient.OrientCooperation2$OrientCooperation2Builder.lambda$1(OrientCooperation2.java:69)
    at org.sonatype.nexus.common.io.CooperatingFuture.performCall(CooperatingFuture.java:123)
    at org.sonatype.nexus.common.io.CooperatingFuture.call(CooperatingFuture.java:65)
    at org.sonatype.nexus.common.io.ScopedCooperationFactorySupport$ScopedCooperation.cooperate(ScopedCooperationFactorySupport.java:99)
    at org.sonatype.nexus.common.cooperation2.internal.orient.OrientCooperation2$OrientCooperation2Builder.cooperate(OrientCooperation2.java:64)
    at org.sonatype.nexus.repository.proxy.ProxyFacetSupport.get(ProxyFacetSupport.java:295)
    at org.sonatype.nexus.repository.proxy.ProxyFacetSupport.get(ProxyFacetSupport.java:278)
    at org.sonatype.nexus.repository.proxy.ProxyHandler.handle(ProxyHandler.java:53)
    at org.sonatype.nexus.repository.view.Context.proceed(Context.java:88)
    at org.sonatype.nexus.repository.storage.UnitOfWorkHandler.handle(UnitOfWorkHandler.java:39)
    at org.sonatype.nexus.repository.view.Context.proceed(Context.java:88)
    at org.sonatype.nexus.repository.view.handlers.ContentHeadersHandler.handle(ContentHeadersHandler.java:46)
    at org.sonatype.nexus.repository.view.Context.proceed(Context.java:88)
    at org.sonatype.nexus.repository.http.PartialFetchHandler.handle(PartialFetchHandler.java:59)
    at org.sonatype.nexus.repository.view.Context.proceed(Context.java:88)
    at org.sonatype.nexus.repository.view.handlers.ConditionalRequestHandler.handle(ConditionalRequestHandler.java:67)
    at org.sonatype.nexus.repository.view.Context.proceed(Context.java:88)
    at org.sonatype.nexus.repository.cache.NegativeCacheHandler.handle(NegativeCacheHandler.java:72)
    at org.sonatype.nexus.repository.view.Context.proceed(Context.java:88)
    at com.sonatype.nexus.clm.internal.orient.FirewallContributedHandler.handle(FirewallContributedHandler.java:114)
    at org.sonatype.nexus.repository.view.Context.proceed(Context.java:88)
    at com.sonatype.analytics.internal.handler.AnalyticsBytesTransferredHandler.handle(AnalyticsBytesTransferredHandler.java:51)
    at org.sonatype.nexus.repository.view.Context.proceed(Context.java:88)
    at com.sonatype.analytics.internal.handler.AnalyticsBytesTransferredHandler.handle(AnalyticsBytesTransferredHandler.java:51)
    at org.sonatype.nexus.repository.view.Context.proceed(Context.java:88)
    at org.sonatype.nexus.repository.view.handlers.HandlerContributor.handle(HandlerContributor.java:67)
    at org.sonatype.nexus.repository.view.Context.proceed(Context.java:88)
    at org.sonatype.nexus.repository.view.handlers.ExceptionHandler.handle(ExceptionHandler.java:42)
    at org.sonatype.nexus.repository.view.Context.proceed(Context.java:88)
    at org.sonatype.nexus.repository.routing.internal.RoutingRuleHandler.handle(RoutingRuleHandler.java:68)
    at org.sonatype.nexus.repository.view.Context.proceed(Context.java:88)
    at org.sonatype.nexus.repository.view.handlers.FormatHighAvailabilitySupportHandler.handle(FormatHighAvailabilitySupportHandler.java:53)
    at org.sonatype.nexus.repository.view.Context.proceed(Context.java:88)
    at com.sonatype.analytics.internal.LoginsCounterHandler.handle(LoginsCounterHandler.java:87)
    at org.sonatype.nexus.repository.view.Context.proceed(Context.java:88)
    at org.sonatype.nexus.repository.security.SecurityHandler.handle(SecurityHandler.java:64)
    at org.sonatype.nexus.repository.view.Context.proceed(Context.java:88)
    at com.sonatype.analytics.internal.handler.AnalyticsMeteringHandler.handle(AnalyticsMeteringHandler.java:69)
    at org.sonatype.nexus.repository.view.Context.proceed(Context.java:88)
    at org.sonatype.nexus.repository.view.handlers.TimingHandler.handle(TimingHandler.java:58)
    at org.sonatype.nexus.repository.view.Context.proceed(Context.java:88)
    at org.sonatype.nexus.repository.view.Context.start(Context.java:179)
    at org.sonatype.nexus.repository.view.Router.dispatch(Router.java:65)
    at org.sonatype.nexus.repository.view.ConfigurableViewFacet.dispatch(ConfigurableViewFacet.java:52)
    at org.sonatype.nexus.repository.view.ConfigurableViewFacet.dispatch(ConfigurableViewFacet.java:43)
    at org.sonatype.nexus.repository.httpbridge.internal.ViewServlet.dispatchAndSend(ViewServlet.java:212)
    at org.sonatype.nexus.repository.httpbridge.internal.ViewServlet.doService(ViewServlet.java:174)
    at org.sonatype.nexus.repository.httpbridge.internal.ViewServlet.service(ViewServlet.java:126)
    at javax.servlet.http.HttpServlet.service(HttpServlet.java:790)
    at com.google.inject.servlet.ServletDefinition.doServiceImpl(ServletDefinition.java:293)
    at com.google.inject.servlet.ServletDefinition.doService(ServletDefinition.java:283)
    at com.google.inject.servlet.ServletDefinition.service(ServletDefinition.java:184)
    at com.google.inject.servlet.DynamicServletPipeline.service(DynamicServletPipeline.java:71)
    at com.google.inject.servlet.FilterChainInvocation.doFilter(FilterChainInvocation.java:85)
    at org.apache.shiro.web.servlet.ProxiedFilterChain.doFilter(ProxiedFilterChain.java:61)
    at org.apache.shiro.web.servlet.AdviceFilter.executeChain(AdviceFilter.java:108)
    at org.apache.shiro.web.servlet.AdviceFilter.doFilterInternal(AdviceFilter.java:137)
    at org.apache.shiro.web.servlet.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:154)
    at org.apache.shiro.web.servlet.ProxiedFilterChain.doFilter(ProxiedFilterChain.java:66)
    at org.apache.shiro.web.servlet.AdviceFilter.executeChain(AdviceFilter.java:108)
    at org.apache.shiro.web.servlet.AdviceFilter.doFilterInternal(AdviceFilter.java:137)
    at org.apache.shiro.web.servlet.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:154)
    at org.apache.shiro.web.servlet.ProxiedFilterChain.doFilter(ProxiedFilterChain.java:66)
    at org.apache.shiro.web.servlet.AdviceFilter.executeChain(AdviceFilter.java:108)
    at org.apache.shiro.web.servlet.AdviceFilter.doFilterInternal(AdviceFilter.java:137)
    at org.apache.shiro.web.servlet.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:154)
    at org.apache.shiro.web.servlet.ProxiedFilterChain.doFilter(ProxiedFilterChain.java:66)
    at org.apache.shiro.web.servlet.AdviceFilter.executeChain(AdviceFilter.java:108)
    at org.apache.shiro.web.servlet.AdviceFilter.doFilterInternal(AdviceFilter.java:137)
    at org.apache.shiro.web.servlet.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:154)
    at org.apache.shiro.web.servlet.ProxiedFilterChain.doFilter(ProxiedFilterChain.java:66)
    at org.apache.shiro.web.servlet.AbstractShiroFilter.executeChain(AbstractShiroFilter.java:458)
    at org.sonatype.nexus.security.SecurityFilter.executeChain(SecurityFilter.java:96)
    at org.apache.shiro.web.servlet.AbstractShiroFilter$1.call(AbstractShiroFilter.java:373)
    at org.apache.shiro.subject.support.SubjectCallable.doCall(SubjectCallable.java:90)
    at org.apache.shiro.subject.support.SubjectCallable.call(SubjectCallable.java:83)
    at org.apache.shiro.subject.support.DelegatingSubject.execute(DelegatingSubject.java:387)
    at org.apache.shiro.web.servlet.AbstractShiroFilter.doFilterInternal(AbstractShiroFilter.java:370)
    at org.sonatype.nexus.security.SecurityFilter.doFilterInternal(SecurityFilter.java:112)
    at org.apache.shiro.web.servlet.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:154)
    at com.google.inject.servlet.FilterChainInvocation.doFilter(FilterChainInvocation.java:82)
    at com.codahale.metrics.servlet.AbstractInstrumentedFilter.doFilter(AbstractInstrumentedFilter.java:112)
    at com.google.inject.servlet.FilterChainInvocation.doFilter(FilterChainInvocation.java:82)
    at org.apache.shiro.web.servlet.ProxiedFilterChain.doFilter(ProxiedFilterChain.java:61)
    at org.apache.shiro.web.servlet.AdviceFilter.executeChain(AdviceFilter.java:108)
    at org.apache.shiro.web.servlet.AdviceFilter.doFilterInternal(AdviceFilter.java:137)
    at org.apache.shiro.web.servlet.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:154)
    at org.apache.shiro.web.servlet.ProxiedFilterChain.doFilter(ProxiedFilterChain.java:66)
    at org.apache.shiro.web.servlet.AdviceFilter.executeChain(AdviceFilter.java:108)
    at org.apache.shiro.web.servlet.AdviceFilter.doFilterInternal(AdviceFilter.java:137)
    at org.apache.shiro.web.servlet.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:154)
    at org.apache.shiro.web.servlet.ProxiedFilterChain.doFilter(ProxiedFilterChain.java:66)
    at org.apache.shiro.web.servlet.AdviceFilter.executeChain(AdviceFilter.java:108)
    at org.apache.shiro.web.servlet.AdviceFilter.doFilterInternal(AdviceFilter.java:137)
    at org.apache.shiro.web.servlet.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:154)
    at org.apache.shiro.web.servlet.ProxiedFilterChain.doFilter(ProxiedFilterChain.java:66)
    at org.apache.shiro.web.servlet.AdviceFilter.executeChain(AdviceFilter.java:108)
    at org.apache.shiro.web.servlet.AdviceFilter.doFilterInternal(AdviceFilter.java:137)
    at org.apache.shiro.web.servlet.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:154)
    at org.apache.shiro.web.servlet.ProxiedFilterChain.doFilter(ProxiedFilterChain.java:66)
    at org.apache.shiro.web.servlet.AbstractShiroFilter.executeChain(AbstractShiroFilter.java:458)
    at org.sonatype.nexus.security.SecurityFilter.executeChain(SecurityFilter.java:96)
    at org.apache.shiro.web.servlet.AbstractShiroFilter$1.call(AbstractShiroFilter.java:373)
    at org.apache.shiro.subject.support.SubjectCallable.doCall(SubjectCallable.java:90)
    at org.apache.shiro.subject.support.SubjectCallable.call(SubjectCallable.java:83)
    at org.apache.shiro.subject.support.DelegatingSubject.execute(DelegatingSubject.java:387)
    at org.apache.shiro.web.servlet.AbstractShiroFilter.doFilterInternal(AbstractShiroFilter.java:370)
    at org.sonatype.nexus.security.SecurityFilter.doFilterInternal(SecurityFilter.java:112)
    at org.apache.shiro.web.servlet.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:154)
    at com.google.inject.servlet.FilterChainInvocation.doFilter(FilterChainInvocation.java:82)
    at org.sonatype.nexus.repository.httpbridge.internal.ExhaustRequestFilter.doFilter(ExhaustRequestFilter.java:80)
    at com.google.inject.servlet.FilterChainInvocation.doFilter(FilterChainInvocation.java:82)
    at org.apache.shiro.web.servlet.AdviceFilter.executeChain(AdviceFilter.java:108)
    at org.apache.shiro.web.servlet.AdviceFilter.doFilterInternal(AdviceFilter.java:137)
    at org.apache.shiro.web.servlet.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:154)
    at com.google.inject.servlet.FilterChainInvocation.doFilter(FilterChainInvocation.java:82)
    at org.apache.shiro.web.servlet.AdviceFilter.executeChain(AdviceFilter.java:108)
    at org.apache.shiro.web.servlet.AdviceFilter.doFilterInternal(AdviceFilter.java:137)
    at org.apache.shiro.web.servlet.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:154)
    at com.google.inject.servlet.FilterChainInvocation.doFilter(FilterChainInvocation.java:82)
    at com.sonatype.nexus.licensing.internal.LicensingRedirectFilter.doFilter(LicensingRedirectFilter.java:116)
    at com.google.inject.servlet.FilterChainInvocation.doFilter(FilterChainInvocation.java:82)
    at com.codahale.metrics.servlet.AbstractInstrumentedFilter.doFilter(AbstractInstrumentedFilter.java:112)
    at com.google.inject.servlet.FilterChainInvocation.doFilter(FilterChainInvocation.java:82)
    at org.sonatype.nexus.internal.web.ErrorPageFilter.doFilter(ErrorPageFilter.java:79)
    at com.google.inject.servlet.FilterChainInvocation.doFilter(FilterChainInvocation.java:82)
    at org.sonatype.nexus.internal.web.EnvironmentFilter.doFilter(EnvironmentFilter.java:101)
    at com.google.inject.servlet.FilterChainInvocation.doFilter(FilterChainInvocation.java:82)
    at org.sonatype.nexus.internal.web.HeaderPatternFilter.doFilter(HeaderPatternFilter.java:98)
    at com.google.inject.servlet.FilterChainInvocation.doFilter(FilterChainInvocation.java:82)
    at com.google.inject.servlet.DynamicFilterPipeline.dispatch(DynamicFilterPipeline.java:104)
    at com.google.inject.servlet.GuiceFilter.doFilter(GuiceFilter.java:133)
    at org.sonatype.nexus.bootstrap.osgi.DelegatingFilter.doFilter(DelegatingFilter.java:73)
    at org.eclipse.jetty.servlet.FilterHolder.doFilter(FilterHolder.java:201)
    at org.eclipse.jetty.servlet.ServletHandler$Chain.doFilter(ServletHandler.java:1626)
    at org.eclipse.jetty.servlet.ServletHandler.doHandle(ServletHandler.java:552)
    at org.eclipse.jetty.server.handler.ScopedHandler.handle(ScopedHandler.java:143)
    at org.eclipse.jetty.security.SecurityHandler.handle(SecurityHandler.java:600)
    at org.eclipse.jetty.server.handler.HandlerWrapper.handle(HandlerWrapper.java:127)
    at org.eclipse.jetty.server.handler.ScopedHandler.nextHandle(ScopedHandler.java:235)
    at org.eclipse.jetty.server.session.SessionHandler.doHandle(SessionHandler.java:1624)
    at org.eclipse.jetty.server.handler.ScopedHandler.nextHandle(ScopedHandler.java:233)
    at org.eclipse.jetty.server.handler.ContextHandler.doHandle(ContextHandler.java:1440)
    at org.eclipse.jetty.server.handler.ScopedHandler.nextScope(ScopedHandler.java:188)
    at org.eclipse.jetty.servlet.ServletHandler.doScope(ServletHandler.java:505)
    at org.eclipse.jetty.server.session.SessionHandler.doScope(SessionHandler.java:1594)
    at org.eclipse.jetty.server.handler.ScopedHandler.nextScope(ScopedHandler.java:186)
    at org.eclipse.jetty.server.handler.ContextHandler.doScope(ContextHandler.java:1355)
    at org.eclipse.jetty.server.handler.ScopedHandler.handle(ScopedHandler.java:141)
    at org.eclipse.jetty.server.handler.HandlerWrapper.handle(HandlerWrapper.java:127)
    at com.codahale.metrics.jetty9.InstrumentedHandler.handle(InstrumentedHandler.java:239)
    at org.eclipse.jetty.server.handler.HandlerCollection.handle(HandlerCollection.java:146)
    at org.eclipse.jetty.server.handler.HandlerWrapper.handle(HandlerWrapper.java:127)
    at org.eclipse.jetty.server.Server.handle(Server.java:516)
    at org.eclipse.jetty.server.HttpChannel.lambda$handle$1(HttpChannel.java:487)
    at org.eclipse.jetty.server.HttpChannel.dispatch(HttpChannel.java:732)
    at org.eclipse.jetty.server.HttpChannel.handle(HttpChannel.java:479)
    at org.eclipse.jetty.server.HttpConnection.onFillable(HttpConnection.java:277)
    at org.eclipse.jetty.io.AbstractConnection$ReadCallback.succeeded(AbstractConnection.java:311)
    at org.eclipse.jetty.io.FillInterest.fillable(FillInterest.java:105)
    at org.eclipse.jetty.io.ChannelEndPoint$1.run(ChannelEndPoint.java:104)
    at org.eclipse.jetty.util.thread.strategy.EatWhatYouKill.runTask(EatWhatYouKill.java:338)
    at org.eclipse.jetty.util.thread.strategy.EatWhatYouKill.doProduce(EatWhatYouKill.java:315)
    at org.eclipse.jetty.util.thread.strategy.EatWhatYouKill.tryProduce(EatWhatYouKill.java:173)
    at org.eclipse.jetty.util.thread.strategy.EatWhatYouKill.run(EatWhatYouKill.java:131)
    at org.eclipse.jetty.util.thread.ReservedThreadExecutor$ReservedThread.run(ReservedThreadExecutor.java:409)
    at org.eclipse.jetty.util.thread.QueuedThreadPool.runJob(QueuedThreadPool.java:883)
    at org.eclipse.jetty.util.thread.QueuedThreadPool$Runner.run(QueuedThreadPool.java:1034)
    at java.lang.Thread.run(Thread.java:750)

It looks like the last public release of the p2 repository was https://github.com/sonatype/nexus-public/tree/release-3.32.0-03/plugins/nexus-repository-p2 I believe it is no longer open source.

I expect JarExtractor.getSpecificEntity() needs to catch the IOException from the java.util calls and return an empty Optional.

Cheers, Liam.

ptziegler commented 3 weeks ago

The same issue shows up with 3.68.0 and https://download.eclipse.org/releases/2024-06/...

I expect JarExtractor.getSpecificEntity() needs to catch the IOException from the java.util calls and return an empty Optional.

The manifest itself is fine. It looks more like the class is unable to find the file inside the Jar. Even if the exception is caught, it would still not be possible to proxy the item.

Manifest-Version: 1.0
Automatic-Module-Name: org.mortbay.apache.jasper
Bnd-LastModified: 1702514564879
Build-Jdk-Spec: 11
Bundle-Classpath: .
Bundle-Description: A rebundling of Apache Tomcat Jasper to remove the t
 omcat server dependencies,    so that the JSP engine can be used by the
  Eclipse Jetty project.
Bundle-License: http://www.apache.org/licenses/LICENSE-2.0
Bundle-ManifestVersion: 2
Bundle-Name: Mortbay Jasper
Bundle-RequiredExecutionEnvironment: JavaSE-1.7
Bundle-SymbolicName: org.mortbay.jasper.apache-jsp
Bundle-Version: 9.0.83
Created-By: Apache Maven Bundle Plugin 5.1.9
Export-Package: org.apache.juli.logging;version="9.0.83",org.apache.tomc
 at;version="9.0.83",org.apache.tomcat.util.compat;version="9.0.83",org.
 apache.tomcat.util.scan;version="9.0.83",org.apache.tomcat.util.file;ve
 rsion="9.0.83",org.apache.tomcat.util.digester;version="9.0.83",org.apa
 che.tomcat.util.descriptor.tagplugin;version="9.0.83",org.apache.tomcat
 .util.descriptor.tld;version="9.0.83",org.apache.tomcat.util.descriptor
 .web;version="9.0.83",org.apache.tomcat.util;version="9.0.83",org.apach
 e.tomcat.util.buf;version="9.0.83",org.apache.tomcat.util.res;version="
 9.0.83",org.apache.tomcat.util.security;version="9.0.83",javax.servlet.
 jsp;version="2.3",javax.servlet.jsp.el;version="2.3",javax.servlet.jsp.
 tagext;version="2.3",javax.servlet.jsp.resources;version="2.3",org.apac
 he.jasper;version="9.0.83",org.apache.jasper.compiler;version="9.0.83",
 org.apache.jasper.compiler.tagplugin;version="9.0.83",org.apache.jasper
 .el;version="9.0.83",org.apache.jasper.resources;version="9.0.83",org.a
 pache.jasper.runtime;version="9.0.83",org.apache.jasper.security;versio
 n="9.0.83",org.apache.jasper.servlet;version="9.0.83",org.apache.jasper
 .tagplugins.jstl;version="9.0.83",org.apache.jasper.tagplugins.jstl.cor
 e;version="9.0.83",org.apache.jasper.util;version="9.0.83",org.apache.j
 asper.xmlparser;version="9.0.83"
Implementation-Version: 9.0.83
Import-Package: javax.el;version="3.0",javax.naming,javax.net.ssl,javax.
 servlet;version="4.0.0",javax.servlet.annotation;version="4.0.0",javax.
 servlet.descriptor;version="4.0.0",javax.servlet.http;version="4.0.0",j
 avax.servlet.resources;version="4.0.0",javax.xml.parsers,org.apache.el.
 util;version="[9.0,10)",org.apache.tomcat.util.descriptor;version="9.0.
 14";resolution:=optional,org.apache.tomcat.util.descriptor.tagplugin;ve
 rsion="9.0.14";resolution:=optional,org.eclipse.jdt.core.compiler,org.e
 clipse.jdt.internal.compiler,org.eclipse.jdt.internal.compiler.classfmt
 ,org.eclipse.jdt.internal.compiler.env,org.eclipse.jdt.internal.compile
 r.impl,org.eclipse.jdt.internal.compiler.problem,org.xml.sax,org.xml.sa
 x.ext,org.xml.sax.helpers
Require-Capability: osgi.serviceloader;filter:="(osgi.serviceloader=org.
 apache.juli.logging.Log)";resolution:=optional;cardinality:=multiple,os
 gi.extender;filter:="(osgi.extender=osgi.serviceloader.processor)"
Specification-Version: 2.3
Tool: Bnd-6.3.1.202206071316

My assumption is that the current implementation is still using the JarInputStream, which assumes that the manifest file is the first item in the jar...

Example:

This jar is available in our proxy repository:

PS C:\Users\pzi\Downloads> jar -tvf .\bcpg_1.78.1.jar
 54308 Thu Apr 18 14:58:40 CEST 2024 META-INF/MANIFEST.MF
 49892 Thu Apr 18 14:58:40 CEST 2024 META-INF/BC2048KE.SF
  8717 Thu Apr 18 14:58:40 CEST 2024 META-INF/BC2048KE.DSA
     0 Thu Apr 18 04:20:16 CEST 2024 META-INF/
     0 Thu Apr 18 04:20:16 CEST 2024 META-INF/versions/
     0 Thu Apr 18 04:20:16 CEST 2024 META-INF/versions/9/
     0 Thu Apr 18 04:20:16 CEST 2024 META-INF/versions/9/OSGI-INF/
  2539 Thu Apr 18 04:20:16 CEST 2024 META-INF/versions/9/OSGI-INF/MANIFEST.MF
   797 Thu Apr 18 04:20:16 CEST 2024 META-INF/versions/9/module-info.class
     0 Thu Apr 18 04:20:16 CEST 2024 org/
     0 Thu Apr 18 04:20:16 CEST 2024 org/bouncycastle/
     0 Thu Apr 18 04:20:16 CEST 2024 org/bouncycastle/apache/
     0 Thu Apr 18 04:20:16 CEST 2024 org/bouncycastle/apache/bzip2/
   491 Thu Apr 18 04:20:16 CEST 2024 org/bouncycastle/apache/bzip2/BZip2Constants.class
   ...

While this one is not:

PS C:\Users\pzi\Downloads> jar -tvf .\org.mortbay.jasper.apache-el_9.0.83.jar
     0 Fri Feb 01 00:00:00 CET 1980 META-INF/
 11358 Fri Feb 01 00:00:00 CET 1980 META-INF/LICENSE
   167 Fri Feb 01 00:00:00 CET 1980 META-INF/NOTICE
   ...
  1100 Fri Feb 01 00:00:00 CET 1980 javax/el/ValueExpression.class
   705 Fri Feb 01 00:00:00 CET 1980 javax/el/ValueReference.class
   457 Fri Feb 01 00:00:00 CET 1980 javax/el/VariableMapper.class
  1304 Tue Nov 28 01:21:29 CET 2017 META-INF/MANIFEST.MF

Notice how the MANIFEST.MF is the last entry in the jar, rather than the first.

Liam-Jackson-QAS commented 3 weeks ago

The code tries to merge the "source" attributes with the ones it gets from the MANIFEST, so if reading the MANIFEST fails it should still be able to store the artifact using it's source information. Maybe that is not enough metadata to allow the artifact to be fetched during builds. But presumably nexus 2 did something like this, or just didn't use JarInputStream.

Note that nexus 2 doesn't work to mirror newer Eclipse repositories, since around Eclipse 4.30, so nexus 3 must be used.

Is it org.mortbay.jasper.apache-el_9.0.83.jar causing the issue for eclipse 2024-06, or a jar built by eclipse? If the latter, It may be possible to raise the jar issue with eclipse.