# Custom archive causes NPE inside Ivy's AbstractArtifact with 1.11

**URL:** <https://discuss.gradle.org/t/custom-archive-causes-npe-inside-ivys-abstractartifact-with-1-11/2381>\
**Category:** Old Forum Archive\
**Created:** [March 5, 2014, 6:28am UTC](https://discuss.gradle.org/t/custom-archive-causes-npe-inside-ivys-abstractartifact-with-1-11/2381 "2014-03-05T06:28:00Z")\
**Posts on this page:** 10\
**Page:** 1

<div class="post-metadata">

**Author:** ![jakewharton](https://sea1.discourse-cdn.com/gradle/user_avatar/discuss.gradle.org/jakewharton/32/103_2.png) [@jakewharton](https://discuss.gradle.org/u/jakewharton)\
**Post date:** [March 5, 2014, 6:28am UTC](https://discuss.gradle.org/t/custom-archive-causes-npe-inside-ivys-abstractartifact-with-1-11/2381/1 "2014-03-05T06:28:00Z")

</div>

```gradle
def theFile = new File(buildDir, 'foo.txt')
task buildTheFile << {
  theFile << "bar"
}
tasks.findByName('assemble').dependsOn buildTheFile
   artifacts {
  archives file: theFile, name: 'my-artifact', type: 'text', builtBy: buildTheFile
}

```

```gradle
Caused by: java.lang.NullPointerException
 at org.apache.ivy.core.module.descriptor.AbstractArtifact.hashCode(AbstractArtifact.java:51)
 at org.apache.ivy.core.module.descriptor.DefaultModuleDescriptor.addArtifact(DefaultModuleDescriptor.java:375)
 at org.gradle.api.internal.artifacts.metadata.DefaultLocalComponentMetaData.addArtifact(DefaultLocalComponentMetaData.java:53)
 at org.gradle.api.internal.artifacts.ivyservice.moduleconverter.DefaultConfigurationsToArtifactsConverter.addArtifacts(DefaultConfigurationsToArtifactsConverter.java:38)
 at org.gradle.api.internal.artifacts.ivyservice.moduleconverter.PublishLocalComponentFactory.convert(PublishLocalComponentFactory.java:44)
 at org.gradle.api.internal.artifacts.ivyservice.projectmodule.ProjectDependencyResolver.resolve(ProjectDependencyResolver.java:53)
 at org.gradle.api.internal.artifacts.ivyservice.resolveengine.DependencyGraphBuilder.resolve(DependencyGraphBuilder.java:64)
 at org.gradle.api.internal.artifacts.ivyservice.resolveengine.DefaultDependencyResolver$1.transform(DefaultDependencyResolver.java:108)
 at org.gradle.api.internal.artifacts.ivyservice.resolveengine.DefaultDependencyResolver$1.transform(DefaultDependencyResolver.java:77)
 at org.gradle.api.internal.artifacts.ivyservice.DefaultIvyContextManager.withIvy(DefaultIvyContextManager.java:61)
 at org.gradle.api.internal.artifacts.ivyservice.resolveengine.DefaultDependencyResolver.resolve(DefaultDependencyResolver.java:77)
 at org.gradle.api.internal.artifacts.ivyservice.CacheLockingArtifactDependencyResolver$1.create(CacheLockingArtifactDependencyResolver.java:39)
 at org.gradle.api.internal.artifacts.ivyservice.CacheLockingArtifactDependencyResolver$1.create(CacheLockingArtifactDependencyResolver.java:37)
 at org.gradle.cache.internal.DefaultCacheAccess.useCache(DefaultCacheAccess.java:187)
 at org.gradle.cache.internal.DefaultPersistentDirectoryStore.useCache(DefaultPersistentDirectoryStore.java:102)
 at org.gradle.cache.internal.DefaultCacheFactory$ReferenceTrackingCache.useCache(DefaultCacheFactory.java:189)
 at org.gradle.api.internal.artifacts.ivyservice.DefaultCacheLockingManager.useCache(DefaultCacheLockingManager.java:61)
 at org.gradle.api.internal.artifacts.ivyservice.CacheLockingArtifactDependencyResolver.resolve(CacheLockingArtifactDependencyResolver.java:37)
 at org.gradle.api.internal.artifacts.ivyservice.SelfResolvingDependencyResolver.resolve(SelfResolvingDependencyResolver.java:41)
 at org.gradle.api.internal.artifacts.ivyservice.ShortcircuitEmptyConfigsArtifactDependencyResolver.resolve(ShortcircuitEmptyConfigsArtifactDependencyResolver.java:51)
 at org.gradle.api.internal.artifacts.ivyservice.ErrorHandlingArtifactDependencyResolver.resolve(ErrorHandlingArtifactDependencyResolver.java:44)
 at org.gradle.api.internal.artifacts.ivyservice.DefaultConfigurationResolver.resolve(DefaultConfigurationResolver.java:42)
 at org.gradle.api.internal.artifacts.configurations.DefaultConfiguration.resolveNow(DefaultConfiguration.java:240)
 at org.gradle.api.internal.artifacts.configurations.DefaultConfiguration.getResolvedConfiguration(DefaultConfiguration.java:230)
 at org.gradle.api.internal.artifacts.configurations.DefaultConfiguration_Decorated.getResolvedConfiguration(Unknown Source)
 at org.gradle.api.internal.artifacts.configurations.DefaultConfiguration$ConfigurationFileCollection.getFiles(DefaultConfiguration.java:463)
 ... 61 more

```

---

<div class="post-metadata">

**Author:** ![luke\_daley](https://sea1.discourse-cdn.com/gradle/user_avatar/discuss.gradle.org/luke_daley/32/9890_2.png) [@luke\_daley](https://discuss.gradle.org/u/luke_daley)\
**Post date:** [March 5, 2014, 6:34am UTC](https://discuss.gradle.org/t/custom-archive-causes-npe-inside-ivys-abstractartifact-with-1-11/2381/2 "2014-03-05T06:34:00Z")

</div>

You’re missing the ‘ext’ (extension) property.

---

<div class="post-metadata">

**Author:** ![jakewharton](https://sea1.discourse-cdn.com/gradle/user_avatar/discuss.gradle.org/jakewharton/32/103_2.png) [@jakewharton](https://discuss.gradle.org/u/jakewharton)\
**Post date:** [March 5, 2014, 6:35am UTC](https://discuss.gradle.org/t/custom-archive-causes-npe-inside-ivys-abstractartifact-with-1-11/2381/3 "2014-03-05T06:35:00Z")

</div>

Ah, ok. I think this doc (specifically 15.4) needs updated then: [http://www.gradle.org/docs/current/userguide/artifact\_management.html](http://www.gradle.org/docs/current/userguide/artifact_management.html)

---

<div class="post-metadata">

**Author:** ![luke\_daley](https://sea1.discourse-cdn.com/gradle/user_avatar/discuss.gradle.org/luke_daley/32/9890_2.png) [@luke\_daley](https://discuss.gradle.org/u/luke_daley)\
**Post date:** [March 5, 2014, 6:37am UTC](https://discuss.gradle.org/t/custom-archive-causes-npe-inside-ivys-abstractartifact-with-1-11/2381/4 "2014-03-05T06:37:00Z")

</div>

If you let me know it works, I’ll update the doc 🙂

---

<div class="post-metadata">

**Author:** ![luke\_daley](https://sea1.discourse-cdn.com/gradle/user_avatar/discuss.gradle.org/luke_daley/32/9890_2.png) [@luke\_daley](https://discuss.gradle.org/u/luke_daley)\
**Post date:** [March 5, 2014, 6:38am UTC](https://discuss.gradle.org/t/custom-archive-causes-npe-inside-ivys-abstractartifact-with-1-11/2381/5 "2014-03-05T06:38:00Z")

</div>

Actually, taking a deeper look… this is only required if the file you are adding doesn’t have an extension. If it does that is used as the default value.

---

<div class="post-metadata">

**Author:** ![jakewharton](https://sea1.discourse-cdn.com/gradle/user_avatar/discuss.gradle.org/jakewharton/32/103_2.png) [@jakewharton](https://discuss.gradle.org/u/jakewharton)\
**Post date:** [March 5, 2014, 6:39am UTC](https://discuss.gradle.org/t/custom-archive-causes-npe-inside-ivys-abstractartifact-with-1-11/2381/6 "2014-03-05T06:39:00Z")

</div>

My file lacks an extension. I’m guilty of doctoring my example code. Trying to add extension property now…

---

<div class="post-metadata">

**Author:** ![jakewharton](https://sea1.discourse-cdn.com/gradle/user_avatar/discuss.gradle.org/jakewharton/32/103_2.png) [@jakewharton](https://discuss.gradle.org/u/jakewharton)\
**Post date:** [March 5, 2014, 6:43am UTC](https://discuss.gradle.org/t/custom-archive-causes-npe-inside-ivys-abstractartifact-with-1-11/2381/7 "2014-03-05T06:43:00Z")

</div>

Success with:

```gradle
artifacts {
  archives file: execFile, name: 'my-artifact', type: 'text', builtBy: execJar, extension: 'jar'
}

```

Thanks!

---

<div class="post-metadata">

**Author:** ![luke\_daley](https://sea1.discourse-cdn.com/gradle/user_avatar/discuss.gradle.org/luke_daley/32/9890_2.png) [@luke\_daley](https://discuss.gradle.org/u/luke_daley)\
**Post date:** [March 5, 2014, 6:45am UTC](https://discuss.gradle.org/t/custom-archive-causes-npe-inside-ivys-abstractartifact-with-1-11/2381/8 "2014-03-05T06:45:00Z")

</div>

Great.

So this indicates that ‘ext’ is required even if ‘execFile’ has an extension?

---

<div class="post-metadata">

**Author:** ![jakewharton](https://sea1.discourse-cdn.com/gradle/user_avatar/discuss.gradle.org/jakewharton/32/103_2.png) [@jakewharton](https://discuss.gradle.org/u/jakewharton)\
**Post date:** [March 5, 2014, 6:50am UTC](https://discuss.gradle.org/t/custom-archive-causes-npe-inside-ivys-abstractartifact-with-1-11/2381/9 "2014-03-05T06:50:00Z")

</div>

My real file did not have an extension and required the ‘extension’ property. When I add an extension to the real file the additional property is not required.

The exception message kind of sucks but it’s down in Ivy. Should I file a request for a better message there?

---

<div class="post-metadata">

**Author:** ![luke\_daley](https://sea1.discourse-cdn.com/gradle/user_avatar/discuss.gradle.org/luke_daley/32/9890_2.png) [@luke\_daley](https://discuss.gradle.org/u/luke_daley)\
**Post date:** [March 5, 2014, 7:07am UTC](https://discuss.gradle.org/t/custom-archive-causes-npe-inside-ivys-abstractartifact-with-1-11/2381/10 "2014-03-05T07:07:00Z")

</div>

Looks like it’s already been fixed in 1.12: [https://github.com/gradle/gradle/commit/c21446f6ea7a32555d0e7f4fa89a8746cf995c0e](https://github.com/gradle/gradle/commit/c21446f6ea7a32555d0e7f4fa89a8746cf995c0e)
