Generate ivy.xml with Gradle ivy-publish plugin - gradle

Hi I want to make empty project (without source), which to use my jar helloWorldPlugin and to manipulate with the ivy descriptor so I made build.gradle in an empty project dir with content:
apply plugin: 'java'
apply plugin: 'ivy-publish'
publishing {
publications {
myPublication(IvyPublication) {
from components.java
}
repositories {
ivy {
url "$project.rootDir/build/publish"
}
}
}
When I execute
gradle publishmyPublicationPublicationToIvyRepository
I get xml descriptor
<?xml version="1.0" encoding="UTF-8"?>
<ivy-module version="2.0">
<info organisation="org.moo" module="ivypublish" revision="9.0-m1-SNAPSHOT" status="integration" publication="20130710180056"/>
<configurations>
<conf name="default" visibility="public" extends="runtime"/>
<conf name="runtime" visibility="public"/>
</configurations>
<publications>
<artifact name="ivypublish" type="jar" ext="jar" conf="runtime"/>
</publications>
<dependencies>
<dependency org="org.moo" name="helloWorldPlugin" rev="9.2-m1-SNAPSHOT" conf="runtime->default" revConstraint="latest.milestone"/>
</dependencies>
</ivy-module>
1.But I don't have all java plugins configurations like test, compile etc. why?
2.If I don't write from components.java in the xml file there is only tag and other tags like dependencies, conf are empty. WHy?
3.How to make Gradle to write all java plugin configurations in the ivy descriptor?

A little late here but I believe this may be missing a configurations section in the myPublication. e.g.
configurations {
unitTests { extend 'runtime' }
}
and then an associated artifact and task definition for the unit test configuration

Related

ivy.xml to pom.xml file

I am attempting to replace our internal Ivy repository with Artifactory and converting everything to Maven. The current repository is hosted on one of our servers in subversion and I am trying to get away from this. My biggest question has to do with the markdown of the ivy.xml and how it relates to pom.xml. I used the ant task makepom to convert but it seems to exclude the configurations and the publications section in the ivy.xml file. To be honest, I am new to ivy and maven and can't seem to find anything that explains this is maven terms. The particular file in question looks like this
<?xml version="1.0" encoding="UTF-8"?>
<?xml-stylesheet type="text/xsl" href="../../../../xsl/ivy-doc.xsl"?>
<ivy-module xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" version="2.0" xsi:noNamespaceSchemaLocation="../../../../xsd/ivy.xsd">
<info organisation="net.java.dev.jna" module="jna" revision="3.4.0" status="release" publication="20111210120000">
<license name="GNU Lesser General Public License, version 2.1 or later" url="http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html"/>
<ivyauthor xmlns:ivyde="http://ant.apache.org/ivy/ivyde/ns/" name="Ivy RoundUp Repository" url="https://github.com/archiecobbs/ivyroundup/blob/master/src/modules/net.java.dev.jna/jna/3.4.0/"/>
<repository xmlns:ivyde="http://ant.apache.org/ivy/ivyde/ns/" pattern="https://raw.githubusercontent.com/archiecobbs/ivyroundup/master/repo/modules/[organisation]/[module]/[revision]/ivy.xml" ivys="true" url="https://github.com/archiecobbs/ivyroundup" name="ivyroundup"/>
<description homepage="https://github.com/java-native-access/jna">
</info>
<configurations>
<conf name="core" description="JNA core library"/>
<conf name="platform" description="JNA platform library"/>
<conf name="default" extends="core,platform" description="JNA core + platform library"/>
</configurations>
<publications>
<artifact name="jna" ext="pom" type="pom"/>
<artifact conf="core" name="jna"/>
<artifact conf="core" name="jna-source" type="source" ext="zip"/>
<artifact conf="core" name="jna-javadoc" type="javadoc" ext="zip"/>
<artifact conf="platform" name="platform"/>
<artifact conf="platform" name="platform-source" type="source" ext="zip"/>
<artifact conf="platform" name="platform-javadoc" type="javadoc" ext="zip"/>
</publications>
The pom file I have created looks like so
<?xml version="1.0" encoding="UTF-8"?>
<!--
Apache Maven 2 POM generated by Apache Ivy
http://ant.apache.org/ivy/
Apache Ivy version: 2.4.0 20141213170938
-->
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
<modelVersion>4.0.0</modelVersion>
<groupId>net.java.dev.jna</groupId>
<artifactId>jna</artifactId>
<packaging>jar</packaging>
<version>3.4.0</version>
<url>https://github.com/java-native-access/jna</url>
</project>
I've omitted some of the code connecting to our server. Trying to publish with maven publishes an empty jar file, I want to just publish the existing 3rd party jar. Any ways, if I could get some more clarification on migrating that publications block over to the pom file, that would be great.

Gradle and Ivy configuration

I have a module that was published on my own repository. Its ivy.xml looks like this:
<?xml version="1.0" encoding="UTF-8"?>
<ivy-module version="2.0">
<info organisation="myorg" module="mymodule" revision="1.5" status="integration" publication="20161222140109"/>
<configurations>
<conf name="compile" visibility="public"/>
</configurations>
<publications>
<artifact name="myartifact" type="zip" ext="zip" conf="compile"/>
</publications>
<dependencies/>
</ivy-module>
In another gradle project, I use this dependency:
configurations {
compile
}
dependencies {
compile 'myorg:mymodule:1.5'
}
What I expected was, that gradle would use the "compile"-configuration in my gradle script to download the "compile"-configuration of the ivy dependency.
What actually happens is that I get an error because Gradle searches for a "default" ivy-configuration.
I know how I can add the configuration info to the dependency with configuration: 'compile' (see this question) but I would not like to do that manually if there is a more elegant way.
Question: Was I wrong by believing that Gradle uses the configurationName in the dependency declaration to search for the matching ivy-configuration? And do I really have to configure each ivy-configuration manually if I don't use default?

Apache IVY to Maven : MakePom Task

How exactly translate IVY to Maven configurations through the task makepom ?
1.) For example IVY "default" Configuration has no equivalent in its Maven Scope :
  
   I understand ... You could put that in a generation task, makempom would do the following equivalence :
<ivy:makepom ..... conf=”default,compile,runtime”>
<mapping conf="default" scope="compile"/>
<mapping conf="compile " scope="compile"/>
<mapping conf="runtime" scope="runtime"/>
</ivy>
2.) But what happens when you have dynamic configurations in IVY, for example, with this IVY configuration, for example "myConf" :
<configurations defaultconf="default->default">
<conf name="default" description="shortcut to runtime and master dependencies"/>
<conf name="compile" description="Used ONLY at compile time" />
<conf name="myConf" description="Not required at compile time BUT required for execution and so deployed to a server"/>
</configurations>
What possibilities exist in this case of translation from IVY to Mave ??? Especially if un have "n" different configurations  , does not seem very practical to have to configurate "n" confs into the makepom task with his corresponding scope. Also I note that if you do not put anything in the task makepom, the generared pon has no scope and always is put to optional :
<dependency>
<groupId>org.apache.commons</groupId>
<artifactId>commons-lang3</artifactId>
<version>3.3</version>
<optional>true</optional>
</dependency>
This maven code is resulting from an ivy file where the commons-lang3 libs is put on the "default" setting :
<dependency org="org.apache.commons" name="commons-lang3" rev="3.3" conf="default->default"/>
I answer myself.
It's only possible to use the Maven Scopes. If there is any configurantion in ivy that it has not his equivalent scope on Maven you have to define the equivalence to Maven scope into the makepom task,
For example:

Does Gradle support classifiers for Ivy repositories?

I'm trying to retrieve Gradle dependencies from an Ivy repository (in Artifactory) based on a classifier (to filter DLLs containing native code to get just the ones for the relevant processor architecture). My build.gradle looks like this:
repositories {
ivy {
name 'prebuilts'
url "${repositoryServer}/prebuilts"
credentials {
username artifactoryUser
password artifactoryPassword
}
layout 'pattern', {
artifact '[organisation]/[module]/[revision]/[artifact](-[classifier]).[ext]'
ivy '[organisation]/[module]/[revision]/ivy-[revision].xml'
}
}
}
configurations {
example
}
dependencies {
example group: 'ThirdParty', name: 'jogl_JSR-231', version: '1.1.0.1', configuration: 'nativeRuntime', classifier: 'release_win32'
}
project.configurations.example.each {
println it
}
The ivy.xml for that dependency looks like this:
<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
<ivy-module version="2.0">
<info organisation="ThirdParty" module="jogl_JSR-231" revision="1.1.0.1" status="release" publication="20130508143052"/>
<configurations>
<conf name="nativeRuntime" description="Native artifacts for running tests." visibility="public"/>
<conf name="archives" description="Configuration for archive artifacts." visibility="public"/>
<conf name="default" extends="runtime" description="Configuration for default artifacts." visibility="public"/>
<conf name="compile" description="Classpath for compiling the main sources." visibility="private"/>
<conf name="runtime" extends="compile" description="Classpath for running the compiled main classes." visibility="private"/>
<conf name="testCompile" extends="compile" description="Classpath for compiling the test sources." visibility="private"/>
<conf name="testRuntime" extends="runtime,testCompile" description="Classpath for running the compiled test classes." visibility="private"/>
<conf name="cppCompile" description="Configuration for API artifacts (headers)." visibility="public"/>
<conf name="nativeArchives" description="Configuration for native archive artifacts." visibility="public"/>
</configurations>
<publications>
<artifact name="gluegen-rt" type="jar" ext="jar" conf="archives,runtime"/>
<artifact name="jogl" type="jar" ext="jar" conf="archives,runtime"/>
<artifact xmlns:m="http://ant.apache.org/ant/maven" name="gluegen-rt" type="jar" ext="jar" conf="archives" m:classifier="sources"/>
<artifact xmlns:m="http://ant.apache.org/ant/maven" name="jogl" type="jar" ext="jar" conf="archives" m:classifier="sources"/>
<artifact xmlns:m="http://ant.apache.org/ant/maven" name="gluegen-rt" type="dll" ext="dll" conf="nativeArchives,nativeRuntime" m:classifier="release_win32"/>
<artifact xmlns:m="http://ant.apache.org/ant/maven" name="jogl" type="dll" ext="dll" conf="nativeArchives,nativeRuntime" m:classifier="release_win32"/>
<artifact xmlns:m="http://ant.apache.org/ant/maven" name="jogl_awt" type="dll" ext="dll" conf="nativeArchives,nativeRuntime" m:classifier="release_win32"/>
<artifact xmlns:m="http://ant.apache.org/ant/maven" name="jogl_cg" type="dll" ext="dll" conf="nativeArchives,nativeRuntime" m:classifier="release_win32"/>
<artifact xmlns:m="http://ant.apache.org/ant/maven" name="gluegen-rt" type="dll" ext="dll" conf="nativeArchives,nativeRuntime" m:classifier="release_x64"/>
<artifact xmlns:m="http://ant.apache.org/ant/maven" name="jogl" type="dll" ext="dll" conf="nativeArchives,nativeRuntime" m:classifier="release_x64"/>
<artifact xmlns:m="http://ant.apache.org/ant/maven" name="jogl_awt" type="dll" ext="dll" conf="nativeArchives,nativeRuntime" m:classifier="release_x64"/>
<artifact xmlns:m="http://ant.apache.org/ant/maven" name="jogl_cg" type="dll" ext="dll" conf="nativeArchives,nativeRuntime" m:classifier="release_x64"/>
<artifact name="joglBuildRecord" type="txt" ext="txt" conf="archives"/>
</publications>
<dependencies/>
</ivy-module>
I get the following error:
FAILURE: Build failed with an exception.
* Where:
Build file 'C:\tmp\gradle-scratch\dependencies-by-classifier\build.gradle' line: 25
* What went wrong:
A problem occurred evaluating root project 'dependencies-by-classifier'.
> Could not resolve all dependencies for configuration ':example'.
> Artifact 'ThirdParty:jogl_JSR-231:1.1.0.1:release_win32#jar' not found.
* Try:
Run with --stacktrace option to get the stack trace. Run with --info or --debug option to get more log output.
BUILD FAILED
I'm not at all sure what I'm doing wrong here. Is it the classifier? If I remove it everything works (although obviously I don't get what I want).
Ivy does not support classifiers. See the syntax of Ivy patterns at the Ivy documentation: http://ant.apache.org/ivy/history/latest-milestone/concept.html#patterns
Where did you get the Ivy definition of JOGL? If you made it yourself I would change the configurations to:
<conf name="nativeRuntime32" .../>
<conf name="nativeRuntime64" .../>
<conf name="nativeRuntime" extends="nativeRuntime32,nativeRuntime64" .../>
In Gradle you can than use configuration nativeRuntime32 to get the artifacts that you need.
If you did not write the Ivy definition, you might consider asking the JOGL developers to add more flexible Ivy configurations so people can more easily select the artifacts they need.

Getting several jars from artifactory as a package

I am trying to understand how to manage this situation, suppose I have a 3rd party library (best-lib) that consists of three jars (a.jar, b.jar, c.jar) and I will be uploading those jars to a personal Artifactory server, the (best-lib) has two versions 1.0 and 2.0.
What I would like to have in my ivy.xml file is one single dependency to retrieve all those jars at once for example:
<dependencies>
<dependency org="mycompany" name="best-lib" rev="1.0" />
</dependencies>
And this dependency should add all three jars (a, b, and c) of version 1.0.
The question is:
Is this possible?
How can I upload the three jars to artifactory to achieve this behaviour?
Is it possible to upload those jars all at once?
Artifactory alternative solutions are also acceptable (e.g. Nexus or Archivia).
Note: I am not building best-lib I just have its jars, and best-lib is not a library that can be downloaded from a public maven2 repository.
Thanks.
When publishing the "best-lib" module, use an ivy.xml file that lists the 3 jars published by the module:
<ivy-module version="2.0">
<info organisation="mycompany" module="best-lib"/>
<publications>
<artifact name="a" type="jar"/>
<artifact name="b" type="jar"/>
<artifact name="c" type="jar"/>
</publications>
..
..
When you create a dependency against this module, ivy will understand that there are 3 jars in this module.
For an example of how to publish an ivy module see:
Issues using ivy:publish task
Update
If the 3 jars are already in your repository you could publish a stand-alone ivy modules that references the other 3 as dependencies:
<ivy-module version="2.0">
<info organisation="mycompany" module="best-lib" rev="1.0"/>
<dependences>
<dependency org="mycompany" name="a" rev="1.0" />
<dependency org="mycompany" name="b" rev="1.0" />
<dependency org="mycompany" name="c" rev="1.0" />
</dependencies>
Finally, you may need to tell us what format your Artifactory repository uses.... I have been assuming it's an ivy repo. If it's Maven then the concepts are the same but obviously server-side we'd be talking about pom.xml files, instead of ivy.xml (Ivy supports Maven repositories).

Resources