问题
Given:
<dependency org="foo" name="bar" />
and no configurations, following ant snippet:
<echo>${ivy.configuration}</echo>
<ivy:makepom ivyfile="${build.dir}/ivy.xml" pomfile="${build.dir}/${ivy.module}.pom">
<mapping conf="default" scope="compile" />
</ivy:makepom>
Produces pom with with optional dependency on foo.bar and prints "default".
If I change mapping to conf="*"
then it works but it is obviously suboptimal.
Is it possible to map unspecified default configuration or do I need to set conf="default" on all dependencies in ivy.xml ?
回答1:
The optional dependency mapping appears to be the default behaviour.
Ivy is not restricted to a fixed number of scopes. While ivy configurations are much more flexible, you cannot assume that each configuration is being use to populate standard project classpaths....
The safest thing to do is provide an explicit mapping of each ivy configuration to the matching scope in Maven. In practice I recommend creating an ivy configuration to to emulate each Maven scope (regardless of whether it's used or not).
<target name="generate-pom" depends="resolve" description="Generate Maven POM">
<ivy:deliver deliverpattern="${build.dir}/ivy.xml" pubrevision="${project.version}"/>
<ivy:makepom ivyfile="${build.dir}/ivy.xml" pomfile="${build.dir}/${ivy.module}.pom">
<mapping conf="compile" scope="compile" />
<mapping conf="runtime" scope="runtime" />
<mapping conf="test" scope="test" />
</ivy:makepom>
</target>
Note:
- You omitted the deliver ivy task. Necessary to ensure that ivy dynamic revisions are resolved and that the ivy module has a revision tag set to expected published revision number. (Unlike Maven you don't need to edit the ivy file to increment a module version).
回答2:
It seems that mapping "*" is harmless. Any other specific mappings will still take precedence.
来源:https://stackoverflow.com/questions/17677037/ivy-makepom-marks-all-dependencies-as-optional-despite-mapping