0 Replies Latest reply on Mar 22, 2018 11:32 PM by krmahadevan

    How do I add a resource to a Java archive using ShrinkWrap

    krmahadevan

      My use-case: I am basically adding tests to the open source library TestNG. As part of test, I need to test if TestNG is able to properly work with a jar file and extract out tests from it. Earlier we had a pre-built jar that was checked-in to the codebase and the tests were working with it. Then I came to know that I could use ShrinkWrap to dynamically create a jar.

       

      Here's the version information that I am working with

      • org.jboss.shrinkwrap:shrinkwrap-api:1.2.6
      • org.jboss.shrinkwrap:shrinkwrap-impl-base:1.2.6

       

      I am trying to basically add a few resources to a jar that I am creating using ShrinkWrap. The addition of resources works fine when I build the code locally on my Mac. But when I attempt to build the code via Travis (Travis is basically used as the CI tool for the open source library TestNG), the build keeps failing with the following error

       

      java.lang.IllegalArgumentException: src/test/resources/jarfileutils/testng-tests.xml was not found in any available ClassLoaders
        at org.jboss.shrinkwrap.impl.base.container.ContainerBase.addNestedJarFileResource(ContainerBase.java:811)
        at org.jboss.shrinkwrap.impl.base.container.ContainerBase.addAsResource(ContainerBase.java:1150)
        at org.testng.jarfileutils.JarCreator.generateJar(JarCreator.java:34)
        at org.testng.JarFileUtilsTest.generateTestJar(JarFileUtilsTest.java:30)

       

      Here's how my code looks like

       

      public class JarCreator {
         public static File generateJar() throws IOException {
        File jarFile = File.createTempFile("testng", ".jar");
        ConfigurationBuilder builder = new ConfigurationBuilder();
        Configuration config = builder
        .classLoaders(Collections.singletonList(Thread.currentThread().getContextClassLoader()))
        .build();
        JavaArchive archive = ShrinkWrap
        .createDomain(config)
        .getArchiveFactory()
        .create(JavaArchive.class, "testng-tests.jar")
        .addClasses(getTestClasses());
         for (String resource : getResources()) {
        archive = archive.addAsResource(getFile(resource), new BasicPath(resource));
        }
        archive.as(ZipExporter.class).exportTo(jarFile, true);
         return jarFile;
        }
      
         private static File getFile(String resource) {
         return new File("src/test/resources/" + resource);
        }
      
         private static Class[] getTestClasses() {
         return new Class[]{
        SampleTest1.class,
        SampleTest2.class,
        SampleTest3.class,
        SampleTest4.class,
        SampleTest5.class   };
        }
      
         private static List getResources() {
         return Arrays.asList(
         "jarfileutils/testng-tests.xml",
         "jarfileutils/child.xml",
         "jarfileutils/child/child.xml",
         "jarfileutils/child/childofchild/childofchild.xml",
         "jarfileutils/childofchild/childofchild.xml"   );
        }
      }

       

      Here's how my folder structure looks like in src/test/resources

       

      08:56 $ tree src/test/resources/jarfileutils/
      src/test/resources/jarfileutils/
      ├── child
      │   ├── child.xml
      │   └── childofchild
      │       └── childofchild.xml
      ├── child.xml
      ├── childofchild
      │   └── childofchild.xml
      └── testng-tests.xml

       

      Can someone please let me know, if my code for creating a simple jar is correct or not.

      I have tried to examine the jar that gets created and it seems ok to me. But I dont know why I get the error only on Travis.

       

      In case anyone is interested, here's the complete travis log : https://api.travis-ci.org/v3/job/357213270/log.txt