[ 
https://issues.apache.org/jira/browse/TWILL-182?page=com.atlassian.jira.plugin.system.issuetabpanels:comment-tabpanel&focusedCommentId=15429842#comment-15429842
 ] 

ASF GitHub Bot commented on TWILL-182:
--------------------------------------

Github user chtyim commented on a diff in the pull request:

    https://github.com/apache/twill/pull/1#discussion_r75600610
  
    --- Diff: 
twill-core/src/test/java/org/apache/twill/internal/utils/ApplicationBundlerTest.java
 ---
    @@ -68,6 +71,56 @@ public void testFindDependencies() throws IOException, 
ClassNotFoundException {
         Assert.assertNotSame(classLoader, clz.getClassLoader());
       }
     
    +  @Test
    +  public void testSameJar() throws IOException, ClassNotFoundException {
    +    File dir1 = tmpDir.newFolder();
    +    File dir2 = tmpDir.newFolder();
    +    File j1 = new File(dir1, "samename.jar");
    +    File j2 = new File(dir2, "samename.jar");
    +
    +    createJar(Class1.class, j1);
    +    createJar(Class2.class, j2);
    +    
    +    ClassLoader currentClassLoader = 
Thread.currentThread().getContextClassLoader();
    +    Location location;
    +
    +    try {
    +      URL[] urls = new URL[] { j1.toURI().toURL(), j2.toURI().toURL() };
    +      Thread.currentThread().setContextClassLoader(new 
URLClassLoader(urls, null));
    +
    +      // create bundle
    +      location = new 
LocalLocationFactory(tmpDir.newFolder()).create("test.jar");
    +      ApplicationBundler bundler = new 
ApplicationBundler(ImmutableList.<String> of());
    +      bundler.createBundle(location, Class1.class, Class2.class);
    +
    +    } finally {
    +      Thread.currentThread().setContextClassLoader(currentClassLoader);
    +    }
    +
    +    File targetDir = tmpDir.newFolder();
    +    unjar(new File(location.toURI()), targetDir);
    +
    +    // should be able to load both classes
    +    ClassLoader classLoader = createClassLoader(targetDir);
    +    Class<?> c1 = classLoader.loadClass(Class1.class.getName());
    +    Class<?> c2 = classLoader.loadClass(Class2.class.getName());
    +
    +    // make sure we are loading them from the correct class loader (not 
defaulting back to some classloader
    +    // from the test
    +    Assert.assertSame(classLoader, c1.getClassLoader());
    +    Assert.assertSame(classLoader, c2.getClassLoader());
    +  }
    +
    +  private void createJar(Class<?> clazz, File jarFile) throws IOException {
    +    try (JarOutputStream jos = new JarOutputStream(new 
FileOutputStream(jarFile))) {
    +      String pathname = clazz.getName().replace(".", "/") + ".class";
    +      JarEntry entry = new JarEntry(pathname);
    +      jos.putNextEntry(entry);
    +      IOUtils.copy(clazz.getClassLoader().getResourceAsStream(pathname), 
jos);
    --- End diff --
    
    And that also make sure the proper close of the resource stream.


> ApplicationBundler will overwrite dependencies with identical names
> -------------------------------------------------------------------
>
>                 Key: TWILL-182
>                 URL: https://issues.apache.org/jira/browse/TWILL-182
>             Project: Apache Twill
>          Issue Type: Bug
>          Components: core
>    Affects Versions: 0.7.0-incubating
>            Reporter: Martin Serrano
>             Fix For: 0.8.0
>
>
> If two jars obtained from *different* classpath locations have the same name 
> but different contents, one will overwrite the other.  The dependency code 
> correctly finds the jars (uses the full path in the HashSet which accumulates 
> the deps) but when the bundle is created the jars are written to {{/lib}} 
> under their name.  This results in one overwriting the other.
> While this is not a likely occurrence, it occurs for us in our development 
> environment because our published jar names are built up from their project 
> hierarchy.  For example the model project for our sdk is in {{.../sdk/model}} 
> and will be on the classpath as {{.../sdk/model.jar}} and published as 
> {{sdk-model.jar}}.  
> In practice however this could occur with any jar name and would be more 
> likely over time.
> The {{ApplicationBundler}} could detect this and re-write the name with some 
> part of the path or suffix to ensure the name is unique.



--
This message was sent by Atlassian JIRA
(v6.3.4#6332)

Reply via email to