[
https://issues.apache.org/jira/browse/IVY-1179?page=com.atlassian.jira.plugin.system.issuetabpanels:comment-tabpanel&focusedCommentId=12852029#action_12852029
]
Stefan De Boey commented on IVY-1179:
-------------------------------------
i've created an extra example to illustrate the problem. in this example i
retrieve the module commons-configuration for company org.apache via the
package resolver. the packager resolver is configured to look for the ivy.xml
and the packaging instructions in a directory on disk.
the build.xml file is trivial:
{code:xml}
<project xmlns:ivy="antlib:org.apache.ivy.ant" name="hello-ivy" default="run">
<target name="resolve" description="--> retrieve dependencies with ivy">
<ivy:retrieve organisation="org.apache" module="commons-configuration"
revision="1.6" inline="true" pattern="./[artifact]-[revision].[ext]"/>
</target>
</project>
{code}
this tells ivy to retrieve the module commons-configuration (version 1.6) via
the default resolver.
the ivysettings.xml:
{code:xml}
<ivysettings>
<settings defaultResolver="package" />
<resolvers>
<packager name="package" buildRoot="${basedir}/packager/build"
resourceCache="${basedir}/packager/cache"
preserveBuildDirectories="true">
<ivy
pattern="file://${basedir}/repo/[organisation]/[module]/ivy-[revision].xml" />
<artifact
pattern="file://${basedir}/repo/[organisation]/[module]/packager-[revision].xml"
/>
</packager>
</resolvers>
</ivysettings>
{code}
this specifies a packager resolver as the default resolver. the packager
resolver will look for the module configuration file (ivy.xml and packager.xml}
in the 'repo' directory.
the ivy file (ivy-1.6.xml):
{code:xml}
<?xml version="1.0" encoding="UTF-8"?>
<ivy-module version="2.0"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:noNamespaceSchemaLocation="http://ant.apache.org/ivy/schemas/ivy.xsd">
<info organisation="org.apache" module="commons-configuration"
revision="1.6" />
<publications>
<artifact name="commons-configuration" />
</publications>
</ivy-module>
{code}
and the packaging instruction (packager-1.6.xml):
{code:xml}
<packager-module version="1.0">
<resource dest="archive"
url="http://www.apache.org/dist/commons/configuration/binaries/commons-configuration-1.6.zip"
sha1="f716c88e10a9a776fa70815c44ef4ba5781a2a7e">
<include
name="commons-configuration-1.6/commons-configuration-1.6.jar" />
</resource>
<build>
<move
file="archive/commons-configuration-1.6/commons-configuration-1.6.jar"
tofile="artifacts/jars/commons-configuration.jar" />
</build>
</packager-module>
{code}
Notice the 'include' tag that specifies to only include (extract) the file
commons-configuration-1.6.jar from the commons-configuration directory in the
archive (resource)
Now, if you execute the ANT target and then take a look at the
./packager/build/org.apache/commons-configuration/1.6/archive directory you
will see that the complete archive was extracted and not only the
commons-configuration-1.6.jar file.
> Packager resolver always extracts all files from archives even when the
> packaging instructions contains include tags
> --------------------------------------------------------------------------------------------------------------------
>
> Key: IVY-1179
> URL: https://issues.apache.org/jira/browse/IVY-1179
> Project: Ivy
> Issue Type: Bug
> Components: Core
> Affects Versions: 2.1.0, trunk
> Reporter: Stefan De Boey
> Priority: Minor
> Original Estimate: 2h
> Remaining Estimate: 2h
>
> According to the documentation the packager resolver should unzip/untar only
> specific files and folders (and not the complete archive) from downloaded
> resources in case the packager module description specfies include tags.
> Let's assume we have a module testng (example is taken from the examples in
> the Packager Resolver documentation) and we have a packager module descriptor
> (the packaging instructions) packager.xml specifying the following resource:
> {code:xml}
> <resource dest="archive" url="http://testng.org/${zipname}.zip"
> sha1="2ea19275dc17453306f8bb780fe6ef6e9af7756b">
> <include name="${zipname}/*.jar"/>
> </resource>
> {code}
> this instructs the package resolver to download the resources from
> http://testng.org/... and then extract the archive, but only all JAR files in
> the root of the archive.
> in this case only the JAR's in the ZIP file should be extracted from the
> resource, but that's not the case. at first i didn't notice this, but i was
> creating the packaging instructions for a project which is in a huge ZIP file
> and so i only wanted to extract the files that i actually needed, but i
> noticed that the extraction took way to long.
> i then configured the packager resolver to preserve the build directories
> (where the archive is extracted) for debugging purposes and i noticed that
> the complete archive was still extracted although the packager.xml file
> contained the necessary 'include' tags to only inluce 3 JAR's.
> when using the preserveBuildDirectories switch on the packager resolver, it's
> also possible to view the ANT build file packager-output.xml (this one is
> generated by the packager resolver based on the packaging instructions). this
> build file is executed by the package resolver to do the extraction process.
> this is the relevant part of the packager-output.xml file for the above
> mentioded example for TestNG:
> {code:xml}
> <unzip src="${resdir.N65541}${file.separator}${filename.N65541}"
> dest="archive">
> <fileset dir=".">
> <include name="testng-2.5/*.jar"/>
> </fileset>
> </unzip>
> {code}
> but this is incorrect and that's why the complete zip is still extracted. the
> 'fileset' tag should be used to indicate a set of ZIP files that need to be
> extracted, not to indicate which resources from the archive (specified in the
> 'src' attribute of the unzip tag) need to be included when extracting.
> 'patternset' is what we need here instead of 'fileset'
> the actual problem is situated in the file
> src/java/org/apache/ivy/plugins/resolver/packager/packager.xsl on line 420
> (in the ivy core project).
> {code:xml}
> <xsl:when test="$type = 'zip' or $type = 'war' or $type = 'jar'">
> <unzip src="{$file}" dest="{$dir}">
> <xsl:if test="$includes">
> <fileset dir=".">
> <xsl:copy-of select="$includes"/>
> </fileset>
> </xsl:if>
> </unzip>
> </xsl:when>
> {code}
> should be:
> {code:xml}
> <xsl:when test="$type = 'zip' or $type = 'war' or $type = 'jar'">
> <unzip src="{$file}" dest="{$dir}">
> <xsl:if test="$includes">
> <patternset>
> <xsl:copy-of select="$includes"/>
> </patternset>
> </xsl:if>
> </unzip>
> </xsl:when>
> {code}
> the same needs to be done for the TAR part in the packages.xsl file.
> i already tried this fix and it works.
> if that's OK, i'll create a patch for this and provide the necessary unit
> tests to illustrate the problem and the fix.
--
This message is automatically generated by JIRA.
-
You can reply to this email to add a comment to the issue online.