-
Bug
-
Resolution: Unresolved
-
Major
-
None
-
1.2.4
-
None
In my current JBoss EAP 6.4 project I tried to update Arquillian from 1.1.11 to 1.1.13 which fails with:
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 ...
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/d0df4ba3fd12998388521219e724c3964428a28a
The root cause of the problem lies within the else block of org.jboss.shrinkwrap.impl.base.URLPackageScanner.handle(File, String):
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()); } } }
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/d0df4ba3fd12998388521219e724c3964428a28a#diff-68209d76d20ce7a8aef1913712645af9R1514
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.
- relates to
-
SHRINKWRAP-515 Building SHRINKWRAP: Some tests are never executed
-
- Resolved
-