]
Falko Modler updated SHRINKWRAP-516:
------------------------------------
Priority: Major (was: Critical)
ContainerBase.addPackages() fails with IllegalArgumentException from
ClassLoaderAsset
-------------------------------------------------------------------------------------
Key: SHRINKWRAP-516
URL:
https://issues.jboss.org/browse/SHRINKWRAP-516
Project: ShrinkWrap
Issue Type: Bug
Components: impl-base
Affects Versions: 1.2.4
Reporter: Falko Modler
In my current JBoss EAP 6.4 project I tried to update Arquillian from 1.1.11 to 1.1.13
which fails with:
{noformat}
Caused by: java.lang.IllegalArgumentException:
/com/some_company/some_project/some_package/SomeClass.class not found in classloader
sun.misc.Launcher$AppClassLoader@6bc7c054
at
org.jboss.shrinkwrap.api.asset.ClassLoaderAsset.<init>(ClassLoaderAsset.java:70)
at
org.jboss.shrinkwrap.impl.base.URLPackageScanner.foundClass(URLPackageScanner.java:165)
at
org.jboss.shrinkwrap.impl.base.URLPackageScanner.handle(URLPackageScanner.java:157)
at
org.jboss.shrinkwrap.impl.base.URLPackageScanner.handle(URLPackageScanner.java:159)
at
org.jboss.shrinkwrap.impl.base.URLPackageScanner.handle(URLPackageScanner.java:159)
at
org.jboss.shrinkwrap.impl.base.URLPackageScanner.handle(URLPackageScanner.java:159)
at
org.jboss.shrinkwrap.impl.base.URLPackageScanner.handle(URLPackageScanner.java:159)
at
org.jboss.shrinkwrap.impl.base.URLPackageScanner.handle(URLPackageScanner.java:159)
at
org.jboss.shrinkwrap.impl.base.URLPackageScanner.handle(URLPackageScanner.java:159)
at
org.jboss.shrinkwrap.impl.base.URLPackageScanner.handle(URLPackageScanner.java:159)
at
org.jboss.shrinkwrap.impl.base.URLPackageScanner.handle(URLPackageScanner.java:145)
at
org.jboss.shrinkwrap.impl.base.URLPackageScanner.scanPackage(URLPackageScanner.java:113)
at
org.jboss.shrinkwrap.impl.base.container.ContainerBase.addPackage(ContainerBase.java:1520)
at
org.jboss.shrinkwrap.impl.base.container.ContainerBase.addPackages(ContainerBase.java:1485)
at ...
{noformat}
Arquillian 1.1.13 brings in Shrinkwrap 1.2.6 (we are on 1.2.3 with Arquillian 1.1.11).
After extensive research and debugging I am almost 100% sure that this is a regression
caused by this commit (SHRINKWRAP-505):
https://github.com/shrinkwrap/shrinkwrap/commit/d0df4ba3fd12998388521219e...
The root cause of the problem lies within the {{else}} block of
{{org.jboss.shrinkwrap.impl.base.URLPackageScanner.handle(File, String)}}:
{code:java}
private void handle(File file, String packageName) throws ClassNotFoundException {
for (File child : file.listFiles()) {
if (!child.isDirectory() && child.getName().endsWith(SUFFIX_CLASS))
{
final String packagePrefix = packageName.length() > 0 ? packageName +
"." : packageName;
String className = packagePrefix + child.getName().substring(0,
child.getName().lastIndexOf(SUFFIX_CLASS));
foundClass(className, prefix + className.replace( '.',
'/' ) + SUFFIX_CLASS );
} else if (child.isDirectory() && addRecursively) {
handle(child, packageName + "." + child.getName());
}
}
}
{code}
The first {{handle()}} invocation has an _empty_ {{packageName}} and when the {{else}}
block kicks in, {{handle()}} is called recursively with with e.g. ".com" which
is a malformed package name.
While SHRINKWRAP-505 did not touch this {{else}} block it _did_ remove a crucial
{{.substring(1)}} call, see:
https://github.com/shrinkwrap/shrinkwrap/commit/d0df4ba3fd12998388521219e...
Suggested solution: Don't prepend a dot in case {{packageName}} is empty.
Note: SHRINKWRAP-515 should be resolved alongside this fix as one of the affected tests
was introduced in SHRINKWRAP-505.