Can't Download json-lib in Ivy - ivy

I want to download json-lib-2.3-jdk15.jar. I find ivy don't have classifier tag, so I use maven one, below is the ivy.xml
<ivy-module version="2.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:noNamespaceSchemaLocation="http://ant.apache.org/ivy/schemas/ivy.xsd"
xmlns:m="http://ant.apache.org/ivy/maven">
<info organisation="xxxx" module="xxx" status="integration"/>
<dependencies>
<dependency org="net.sf.json-lib" name="json-lib" rev="2.3">
<artifact name="json-lib" type="jar" m:classifier="jdk15"/>
</dependency>
</dependencies>
</ivy-module>
And ivysetting.xml
<ivysettings>
<settings defaultResolver="default" />
<include url="${ivy.default.settings.dir}/ivysettings-public.xml" />
<include url="${ivy.default.settings.dir}/ivysettings-shared.xml"/>
<include url="${ivy.default.settings.dir}/ivysettings-local.xml" />
<include url="${ivy.default.settings.dir}/ivysettings-main-chain.xml"/>
<caches artifactPattern="[organisation]/[module]/([branch]/)[type]s/([platform]/)[artifact]-[revision](.[ext])" />
<resolvers>
<filesystem name="local">
<ivy
pattern="${ivy.local.default.root}/[organisation]/[module]/([branch]/)[revision]/ivy.xml" />
<artifact
pattern="${ivy.local.default.root}/[organisation]/[module]/([branch]/)[revision]/[type]s/([platform]/)[artifact](.[ext])" />
</filesystem>
<ibiblio name="public" m2compatible="true" usepoms="true" pattern="[organisation]/[module]/[revision]/[artifact]-[revision](-[classifier]).[ext]" />
<chain name="default" returnFirst="true">
<resolver ref="local" />
<resolver ref="public"/>
</chain>
</resolvers>
</ivysettings>
But I still can't download it. It seems like m:classifier not work. Any suggestion about this? Thanks.
I finally find the root reason. I should not use
xmlns:m="http://ant.apache.org/ivy/maven
I should use
xmlns:m="http://ant.apache.org/ivy/extra
Another thing, in my case, I was add "conf" distribute in "artifact" tag, which will make the jar download fail. So do not add "conf" in "artifact".

Works for me.... What version of ivy are you using?
The following example contains some suggested enhancements
Example
Apache Ant(TM) version 1.8.2
Apache Ivy 2.3.0-rc2
ivy.xml
<ivy-module version="2.0" xmlns:m="http://ant.apache.org/ivy/maven">
<info organisation="xxxx" module="xxx"/>
<configurations>
<conf name="jdk15" description="JDK 1.5 dependencies"/>
</configurations>
<dependencies>
<dependency org="net.sf.json-lib" name="json-lib" rev="2.3" conf="jdk15->master">
<artifact name="json-lib" type="jar" m:classifier="jdk15"/>
</dependency>
</dependencies>
</ivy-module>
Notes:
It's always a good idea to use configurations. In this case I've created one called "jdk15" to group the files with jdk15 classifiers
The remote "master" configuration is special and contains no transitive dependencies (See following link for explanation)
How are maven scopes mapped to ivy configurations by ivy
ivysettings.xml
<ivysettings>
<settings defaultResolver="central" />
<resolvers>
<ibiblio name="central" m2compatible="true"/>
</resolvers>
</ivysettings>
Notes:
This is a minimal ivy settings file. (In fact you could omit the file and it would be functionally the same).
Are you using the "local" resolver? In my experience it's unnecessary (Unless you're publishing artifacts during your build)

Related

Error when trying to use optional token in artifacts pattern

Up until now, I was only generating a dist/imasUtils.jar file in the build (using Ant), and publiching it with the following Ant code:
<ivy:resolve/>
<ivy:publish resolver="imas-ssh" overwrite="true" publishivy="true">
<artifacts pattern="dist/[artifact].[ext]"/>
</ivy:publish>
So far, this worked, but now I want to publish also the source, so I am also generating dist/imasUtils_src.zip. According to my understanding of the ivy manual, I could do this:
<ivy:resolve/>
<ivy:publish resolver="imas-ssh" overwrite="true" publishivy="true">
<artifacts pattern="dist/[artifact](_[type]).[ext]"/>
</ivy:publish>
and that would recognize both of my files dist/imasUtils.jar and dist/imasUtils_src.zip, the only difference is that when I published them the type attribute would be null for the jar file.
Instead, I am getting the following error message:
/[myDirectory]/build.xml:119: impossible to publish artifacts for net.conselldemallorca.imas#imasUtils;1.2.0:
java.io.IOException: missing artifact net.conselldemallorca.imas#imasUtils;1.2.0!imasUtils.jar
at org.apache.ivy.core.publish.PublishEngine.publish(PublishEngine.java:225)
at org.apache.ivy.core.publish.PublishEngine.publish(PublishEngine.java:172)
at org.apache.ivy.Ivy.publish(Ivy.java:621)
at org.apache.ivy.ant.IvyPublish.doExecute(IvyPublish.java:311)
at org.apache.ivy.ant.IvyTask.execute(IvyTask.java:271)
at org.apache.tools.ant.UnknownElement.execute(UnknownElement.java:292)
at sun.reflect.GeneratedMethodAccessor4.invoke(Unknown Source)
at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
at java.lang.reflect.Method.invoke(Method.java:606)
...
My ivy.xml file:
<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="net.conselldemallorca.imas"
module="imasUtils" revision="${ivy.revision}"/>
<publications>
<artifact />
</publications>
</ivy-module>
and my organization ivy-settings.xml file:
<ivysettings>
<property name="ivy.pattern" value="artifacts/[organisation]/[module]/r[revision]/ivy-[revision].xml" override="false"/>
<property name="artifact.pattern" value="artifacts/[organisation]/[module]/r[revision]/[artifact].[ext]" override="false"/>
<settings defaultResolver="shared"/>
<resolvers>
<ssh name="imas-ssh" host="MYHOST" publishPermissions="0770">
<ivy pattern="/var/www/html/Ivy/${ivy.pattern}"/>
<artifact pattern="/var/www/html/Ivy/${artifact.pattern}"/>
</ssh>
<chain name="shared">
<url name="imas">
<ivy pattern="http://ivy.proves.imasmallorca.net/Ivy/${ivy.pattern}"/>
<artifact pattern="http://ivy.proves.imasmallorca.net/Ivy/${artifact.pattern}"/>
</url>
<ibiblio name="public" m2compatible="true"/>
</chain>
</resolvers>
</ivysettings>
I am using Apache Ant 1.9.3 and Ivy 2.4.0
I suspect the problem might be the way you've defined the "type" in the pattern. You also need to declare more than one file in your ivy file's publications section.
I suggest the following change to your ivy file:
<ivy-module version="2.0" xmlns:e="http://ant.apache.org/ivy/extra">
<publications>
<artifact name="imasUtils" type="jar"/>
<artifact name="imasUtils" type="zip" e:classifier="src"/>
</publications>
And corresponding change in the publish task's pattern:
<ivy:publish .. >
<artifacts pattern="dist/[artifact](_[classifier]).[ext]"/>
</ivy:publish>
The "classifier" is an example of a custom extra attribute.
Example:
Convert ivy.xml to pom.xml
The following link provides more explanation on how ivy interacts with Maven repos which has a fixed understanding of a "sources" attribute.
how to publish 3rdparty artifacts with ivy and nexus

Why can't Ivy resolve my configurations

I've got an Ivy and Artifactory setup to publish and depend on builds with.
In Artifactory I have an Ivy file along the lines of:
<?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" module="module" branch="HEAD" revision="0.277-SNAPSHOT" status="integration" publication="20140724114055">
</info>
<configurations>
<conf name="compile" visibility="public" description="Default required to compile the full module"/>
<conf name="build" visibility="public" extends="compile" description="Incorporates additional build tools onto the classpath"/>
</configurations>
<publications defaultconf="compile">
<artifact name="module" type="jar" ext="jar"/>
<artifact name="module-src" type="source" ext="zip"/>
<artifact name="module-doc" type="doc" ext="zip"/>
</publications>
<dependencies>
<dependency org="junit" name="junit" rev="4.8.1" conf="compile->*"/>
<dependency org="net.sf.proguard" name="proguard" rev="4.11" conf="build">
<artifact name="proguard" ext="jar"/>
</dependency>
</dependencies>
</ivy-module>
When I come to depend on this module in another project I specify the compile configuration but get told by IvyDE that compile does not exist.
<?xml version="1.0" encoding="ISO-8859-1"?>
<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"
module="module2"
status="integration">
</info>
<configurations>
<conf name="compile" description="Default required to compile the full module" />
</configurations>
<dependencies>
<dependency transitive="true" org="org" name="module" rev="latest.integration" conf="compile">
<artifact name="module" type="jar" ext="jar" />
<artifact name="module-src" type="source" ext="zip" />
<artifact name="module-doc" type="doc" ext="zip" />
</dependency>
</dependencies>
</ivy-module>
With this setup I get the error message
"configuration not found in org#module;0.277-SNAPSHOT: 'compile'"
I do get the jar if the dependency conf is updated to compile->* but I don't get the source or javadoc downloaded unless they are explicitly defined as dependencies. I am also expecting that junit will appear on the build path as it is defined as a compile dependency but there is no sign of that appearing while it doesn't know what the compile configuration is I guess.
Any suggestions please!
It seems the reason for this was Ivy not finding the ivy in artifactory correctly. Using a URL resolver rather than a ibiblio resolver and defining the ivy pattern everything is working correctly.

Publish Only Dependencies

I want to publish the dependencies of a module seperately from the jar artifact of the module.
<?xml version="1.0" encoding="UTF-8"?>
<ivy-module version="2.0">
<info organisation="com.mycompany" module="platform" />
<configurations defaultconfmapping="release->*;compile->*" defaultconf="release">
<conf name="release" />
<conf name="compile" extends="release" />
</configurations>
<publications>
<artifact name="platform-api" type="jar" ext="jar" />
</publications>
<dependencies>
<dependency org="com.google.inject" name="guice" rev="3.0" />
<dependency org="org.slf4j" name="slf4j-api" rev="1.6.6" />
<dependency org="com.google.guava" name="guava" rev="13.0-rc1" conf="compile" />
<dependency org="log4j" name="log4j" rev="1.2.17" conf="compile" />
<dependency org="org.slf4j" name="slf4j-log4j12" rev="1.6.6" conf="compile" />
</dependencies>
</ivy-module>
For the configuration above, I want an artifact that includes guice & slf4j-api jars only, without the platform-api.jar. My current solution is to define two dependencies in the dependent module, one transitive and other not:
<dependency org="com.mycompany" name="platform" rev="1.0-SNAPSHOT" conf="myconf->release">
<exclude org="com.mycompany" />
</dependency>
<dependency org="com.mycompany" name="platform" rev="1.0-SNAPSHOT" transitive="false" conf="myotherconf->release" />
But this solution causes problems when the third module is dependent on both of these modules, and it is just ugly.
Try this instead:
<ivy-module version="2.0">
<info organisation="com.mycompany" module="platform" />
<configurations>
<conf name="default" description="runtime dependencies and master artifact can be used with this conf" extends="runtime,master"/>
<conf name="master" description="contains only the artifact published by this module itself, with no transitive dependencies"/>
<conf name="compile" description="Compile dependencies"/>
<conf name="runtime" description="Runtime dependencies, includes compile dependencies" extends="compile"/>
</configurations>
<publications>
<artifact name="platform-api" type="jar" ext="jar" conf="master"/>
</publications>
<dependencies>
<!-- Compile dependencies -->
<dependency org="com.google.inject" name="guice" rev="3.0" conf="compile->default"/>
<dependency org="org.slf4j" name="slf4j-api" rev="1.6.6" conf="compile->default"/>
<dependency org="com.google.guava" name="guava" rev="13.0-rc1" conf="compile->default" />
<!-- Runtime dependencies -->
<dependency org="log4j" name="log4j" rev="1.2.17" conf="runtime->default" />
<dependency org="org.slf4j" name="slf4j-log4j12" rev="1.6.6" conf="runtime->default" />
</dependencies>
</ivy-module>
Notes:
Note the "extends" attribute on the configurations, used to create larger sets of jars.
I recommend remove the default configuration mapping and explicitly set a conf mapping on each depedency. Simpler and ultimately easier to understand in my opinion (less magic)
Now that your module has separate configurations for the published artifacts and it's runtime dependencies a single dependency declaration can be used as follows to map these to separate local configurations:
<dependency org="com.mycompany" name="platform" rev="1.0-SNAPSHOT" conf="myconf->runtime;myotherconf->master" />
I think, what you are looking for is actually two projects sharing the same dependencies. (and by coincidence one of them is using the other as well).
Did you consider using extends http://ant.apache.org/ivy/history/latest-milestone/ivyfile/extends.html with:
extendType="dependencies".
Then you would have your platform extending the the parent-ivy.xml with the dependencies. And your Other project extending the same parent-ivy.xml file for the same dependencies.
I'm not sure if this is enough. Since the configurations will play role here. But maybe it's a start.

Retrieving dependencies with empty type

I'm trying to figure out how to omit the [type] part in an Ivy retrieve pattern for artifacts that don't have type declared. I use the following ant statement:
<ivy:retrieve pattern="${lib.dir}/[artifact](-[type]).[ext]" conf="compile" />
Despite the parentheses, Ivy produces files like
junit-jar.jar
junit-javadoc.jar
junit-source.jar
The latter two ones are as expected but the first one should be "junit.jar" instead.
The result is the same as when I omit the parentheses.
Edit:
What I'm doing up to now to work around the problem: I have multiple retrieve statements in the build.xml:
<ivy:retrieve pattern="${lib.dir}/[artifact]-[type].[ext]" type="source" />
<ivy:retrieve pattern="${lib.dir}/[artifact].[ext]" type="jar" />
(The "conf" attribute in the original post is not related to this topic.)
But that looks rather silly when there's the feature of optional tokens.
The type defaults to jar, it can't be ommited. See Documentation
So this (-[type]) does not have an affect.
Perhaps you could do something like this in the build.xml (if you control the ivy.xml).
<ivy:retrieve pattern="${lib.dir}/[artifact].[ext]" conf="compile" />
<ivy:retrieve pattern="${lib.dir}/[artifact](-[type]).[ext]" conf="extras" />
You'd have to publish the jar in the compile config and the other jars in the extra config.
Or just name the other ones junit-javadoc and junit-source in the ivy.xml:
<?xml version="1.0" encoding="UTF-8"?>
<ivy-module version="2.0">
<info organisation="junit"
module="jnuit"
revision="4.8.2"
status="release"
publication="20110531150115"
default="true"
/>
<configurations>
<conf name="default" visibility="public"/>
</configurations>
<publications>
<artifact name="junit" type="jar" />
<artifact name="junit-sources" type="jar" />
<artifact name="junit-javadoc" type="jar" />
</publications>
</ivy-module>

Keep Ivy from including test dependencies

Consider an ivy.xml like the following:
<ivy-module version="2.0">
<info organisation="com.foo" module="FooBar" />
<dependencies>
<dependency org="net.sf.ehcache" name="ehcache-core" rev="2.2.0" />
<!--...-->
</dependencies>
</info>
</ivy-module>
When I run Ivy, it fetches all dependencies for EHCache, even testing dependencies. Specifically, it tries to pull in Hibernate 3.5.1 (which, in the POM file, is listed as a "test" dependency).
How do I prevent Ivy from including test dependencies? I could list it as an excluded dependency, but I don't want to have to do this for every test dependency. I'm new to Ivy and used to the way Maven does things. I was reading about configurations but I don't understand how this aspect of Maven's "scope" maps to "configurations."
You need to define the configuration of the dependency like:
<dependency org="net.sf.ehcache" name="ehcache-core" rev="2.2.0" conf="compile"/>
If you omit conf it is assumed, that you meant conf ="*", which will download all configurations for that dependency.
Here is a simple Example:
<configurations>
<conf name="test" visibility="public" />
<conf name="compile" visibility="public" />
</configurations>
<publications>
<artifact name="${project.name}" type="jar" conf="compile" ext="jar"/>
<artifact name="${project.name}-test" type="jar" conf="test" ext="jar"/>
</publications>
<dependencies>
<!-- COMPILE -->
<dependency org="log4j" name="log4j" rev="1.2.14" conf="compile->*"/>
<dependency org="apache" name="commons-net" rev="2.0" conf="compile->*"/>
<dependency org="itext" name="itext" rev="1.4.6" conf="compile->*"/>
<dependency org="jsch" name="jsch" rev="0.1.29" conf="test->*"/>
<!-- TEST -->
</dependencies>
In this example jsch will be included in the test and the compile configuration.
If you resolve this dependency later with conf ="compile" you will get all dependencies EXCEPT jsch.
If you resolve this dependency with conf ="test" you will get jsch only.
And if test would extend compile, you would get all jars.
<configurations>
<conf name="test" visibility="public" extends="compile" />
<conf name="compile" visibility="public" />
</configurations>