saleemshafi / nexus-artifact-usage-plugin Goto Github PK
View Code? Open in Web Editor NEWPlugin for Sonatype's Nexus Repository Manager that will display which artifacts in the repository are dependent on a selected artifact.
License: Other
Plugin for Sonatype's Nexus Repository Manager that will display which artifacts in the repository are dependent on a selected artifact.
License: Other
Both the tree and list views load the artifact's POM file when selecting a new file, and we can probably fix that so that it only runs once and the resulting data is used by both views.
Right now, the usage tree is being populated one-level at a time using an Ajax call. Having the full tree rendered at once opens up the door to a lot of improvements, such as tree searching, quick filtering on the client-side, and some code consolidation with the download option.
We wouldn't have to sacrifice much in terms of performance if we store the data as a graph and then hash our way to the root of the tree that we're interested in. That way the lookup is still constant-time, we'll just be risking sending more data back than in necessary. Although, i think a common use case will be to understand all of the artifacts that usage a particular project, not just the first level.
It turns out the list view that i used has a "card panel" beneath it that shows the details of an item in the grid above. While i would just as soon not have the lower half of the view at all, if i can't figure out how to get rid of it, i could always use that to try and display the path(s) that exist between the selected user and the artifact is depends on.
for some reason the usage list view is calling back to the server twice. there's some not-so-great code in the js file that runs the list view and delays the loading of the list until after the panel is rendered, and i suspect that i did something wrong there.
Provide this plugin also for Nexus version 3.x., please.
any chance to have this plugin for nexus3?
when looking to see if a particular artifact is in the usage tree of another, it might be helpful to see that information as a list, rather than digging through a tree. it's often not entirely necessary to know the path from one artifact to another, just whether a particular artifact is in the tree.
While we could implement this by allowing a search through the tree (once it's fully populated, being able to get a list makes it easier to see what else is in the graph.
We could store the artifact usage data we calculate into files next to each artifact, similar to the way the sha1 hash files and metadata files are stored. This would save us from having to recalculate every time we start up.
On the flip side, it would make it much harder to pull a full tree of data on a particular artifact since we've have to traverse the filesystem, rather than having it all cached in memory. We could try to get around that by storing a full list of artifact usage with each artifact, but that could cause problems with race conditions, especially since the process would take quite a bit longer each time an artifact is updated.
Still, something to consider.
Right now, the only references that are captured are artifact dependencies, but we need to also pick up plugins and reporting plugins.
Nexus 2.3 included a fair amount of refactoring and the plugin (built with 2.0.5) no longer works with this version or anything above.
Hello.
Just installed the plugin on Nexus 2.10.0-02 and from the plugin console I see it marked as bnroken and I get this error message:
This plugin was not able to be activated
... org.ebayopensource.nexus.plugins:artifact-usage-plugin:0.11.0 :: action=ACTIVATE result=BROKEN
Reason: Problem installing: reference:file:/usr/local/sonatype-work/nexus/plugin-repository/artifact-usage-plugin-0.11.0/
Is this plugin compatible with version 2.10?
Currently, it's not possible to checkout and build the thing.
I was missing com.google.atinject (which i downloaded and installed locally)
But now i'm still missing all the -SONATYPE patched JARs.
Reading there, this issue has been resolved
https://issues.sonatype.org/browse/NEXUS-4912
So, a "simple" update of some dependencies should fix this?!
(a binary download of the latest snapshot would solve this as well ;o)
I've got the following exception after an upgrade to Nexus OSS 2.6.0-05.
I'm running Nexus with artifact-usage-plugin-0.11.0-bundle.zip.
jvm 1 | 2013-07-29 09:33:11 WARN [ool-1-thread-12] - Sisu - Error injecting: org.apache.maven.wagon.providers.http.HttpWagon
jvm 1 | java.lang.TypeNotPresentException: Type org.apache.maven.wagon.providers.http.HttpWagon not present
jvm 1 | at org.sonatype.guice.bean.reflect.URLClassSpace.loadClass(URLClassSpace.java:108) ~[sisu-inject-bean-2.3.4.jar:na]
jvm 1 | at org.sonatype.guice.bean.reflect.NamedClass.load(NamedClass.java:44) ~[sisu-inject-bean-2.3.4.jar:na]
jvm 1 | at org.sonatype.guice.bean.reflect.AbstractDeferredClass.get(AbstractDeferredClass.java:44) ~[sisu-inject-bean-2.3.4.jar:na]
jvm 1 | at com.google.inject.internal.ProviderInternalFactory.provision(ProviderInternalFactory.java:86) ~[sisu-guice-3.1.4.jar:3.1.4]
jvm 1 | at com.google.inject.internal.InternalFactoryToInitializableAdapter.provision(InternalFactoryToInitializableAdapter.java:55) ~[sisu-guice-3.1.4.jar:3.1.4]
jvm 1 | at com.google.inject.internal.ProviderInternalFactory$1.call(ProviderInternalFactory.java:70) ~[sisu-guice-3.1.4.jar:3.1.4]
jvm 1 | at com.google.inject.internal.ProvisionListenerStackCallback$Provision.provision(ProvisionListenerStackCallback.java:100) ~[sisu-guice-3.1.4.jar:3.1.4]
jvm 1 | at org.sonatype.guice.plexus.lifecycles.PlexusLifecycleManager.onProvision(PlexusLifecycleManager.java:134) ~[sisu-inject-plexus-2.3.4.jar:na]
jvm 1 | at com.google.inject.internal.ProvisionListenerStackCallback$Provision.provision(ProvisionListenerStackCallback.java:109) ~[sisu-guice-3.1.4.jar:3.1.4]
jvm 1 | at com.google.inject.internal.ProvisionListenerStackCallback.provision(ProvisionListenerStackCallback.java:55) ~[sisu-guice-3.1.4.jar:3.1.4]
jvm 1 | at com.google.inject.internal.ProviderInternalFactory.circularGet(ProviderInternalFactory.java:68) ~[sisu-guice-3.1.4.jar:3.1.4]
jvm 1 | at com.google.inject.internal.InternalFactoryToInitializableAdapter.get(InternalFactoryToInitializableAdapter.java:47) ~[sisu-guice-3.1.4.jar:3.1.4]
jvm 1 | at com.google.inject.internal.InjectorImpl$2$1.call(InjectorImpl.java:997) ~[sisu-guice-3.1.4.jar:3.1.4]
jvm 1 | at com.google.inject.internal.InjectorImpl.callInContext(InjectorImpl.java:1047) ~[sisu-guice-3.1.4.jar:3.1.4]
jvm 1 | at com.google.inject.internal.InjectorImpl$2.get(InjectorImpl.java:993) ~[sisu-guice-3.1.4.jar:3.1.4]
jvm 1 | at com.google.inject.Scopes$1$1.get(Scopes.java:59) ~[sisu-guice-3.1.4.jar:3.1.4]
jvm 1 | at org.sonatype.guice.bean.locators.LazyBeanEntry.getValue(LazyBeanEntry.java:82) ~[sisu-inject-bean-2.3.4.jar:na]
jvm 1 | at org.sonatype.guice.plexus.locators.LazyPlexusBean.getValue(LazyPlexusBean.java:52) ~[sisu-inject-plexus-2.3.4.jar:na]
jvm 1 | at org.codehaus.plexus.DefaultPlexusContainer.lookup(DefaultPlexusContainer.java:259) ~[sisu-inject-plexus-2.3.4.jar:na]
jvm 1 | at org.codehaus.plexus.DefaultPlexusContainer.lookup(DefaultPlexusContainer.java:251) ~[sisu-inject-plexus-2.3.4.jar:na]
jvm 1 | at org.sonatype.aether.connector.wagon.PlexusWagonProvider.lookup(PlexusWagonProvider.java:32) ~[na:na]
jvm 1 | at org.sonatype.aether.connector.wagon.WagonRepositoryConnector.lookupWagon(WagonRepositoryConnector.java:282) ~[na:na]
jvm 1 | at org.sonatype.aether.connector.wagon.WagonRepositoryConnector.(WagonRepositoryConnector.java:154) ~[na:na]
jvm 1 | at org.sonatype.aether.connector.wagon.WagonRepositoryConnectorFactory.newInstance(WagonRepositoryConnectorFactory.java:142) ~[na:na]
jvm 1 | at org.sonatype.aether.impl.internal.DefaultRemoteRepositoryManager.getRepositoryConnector(DefaultRemoteRepositoryManager.java:346) ~[aether-impl-1.13.1.jar:na]
jvm 1 | at org.sonatype.aether.impl.internal.DefaultMetadataResolver$ResolveTask.run(DefaultMetadataResolver.java:559) ~[aether-impl-1.13.1.jar:na]
jvm 1 | at org.sonatype.aether.util.concurrency.RunnableErrorForwarder$1.run(RunnableErrorForwarder.java:60) ~[aether-util-1.13.1.jar:na]
jvm 1 | at org.sonatype.aether.impl.internal.DefaultMetadataResolver$1.execute(DefaultMetadataResolver.java:486) ~[aether-impl-1.13.1.jar:na]
jvm 1 | at org.sonatype.aether.impl.internal.DefaultMetadataResolver.resolve(DefaultMetadataResolver.java:345) ~[aether-impl-1.13.1.jar:na]
jvm 1 | at org.sonatype.aether.impl.internal.DefaultMetadataResolver.resolveMetadata(DefaultMetadataResolver.java:173) ~[aether-impl-1.13.1.jar:na]
jvm 1 | at org.apache.maven.repository.internal.DefaultVersionResolver.resolveVersion(DefaultVersionResolver.java:225) ~[na:na]
jvm 1 | at org.sonatype.aether.impl.internal.DefaultArtifactResolver.resolve(DefaultArtifactResolver.java:272) ~[aether-impl-1.13.1.jar:na]
jvm 1 | at org.sonatype.aether.impl.internal.DefaultArtifactResolver.resolveArtifacts(DefaultArtifactResolver.java:216) ~[aether-impl-1.13.1.jar:na]
jvm 1 | at org.sonatype.aether.impl.internal.DefaultArtifactResolver.resolveArtifact(DefaultArtifactResolver.java:193) ~[aether-impl-1.13.1.jar:na]
jvm 1 | at org.apache.maven.repository.internal.DefaultModelResolver.resolveModel(DefaultModelResolver.java:122) ~[na:na]
jvm 1 | at org.apache.maven.model.building.DefaultModelBuilder.readParentExternally(DefaultModelBuilder.java:813) ~[na:na]
jvm 1 | at org.apache.maven.model.building.DefaultModelBuilder.readParent(DefaultModelBuilder.java:664) ~[na:na]
jvm 1 | at org.apache.maven.model.building.DefaultModelBuilder.build(DefaultModelBuilder.java:310) ~[na:na]
jvm 1 | at org.apache.maven.model.building.DefaultModelBuilder.build(DefaultModelBuilder.java:232) ~[na:na]
jvm 1 | at org.apache.maven.repository.internal.DefaultArtifactDescriptorReader.loadPom(DefaultArtifactDescriptorReader.java:322) ~[na:na]
jvm 1 | at org.apache.maven.repository.internal.DefaultArtifactDescriptorReader.readArtifactDescriptor(DefaultArtifactDescriptorReader.java:186) ~[na:na]
jvm 1 | at org.sonatype.aether.impl.internal.DefaultRepositorySystem.readArtifactDescriptor(DefaultRepositorySystem.java:279) ~[aether-impl-1.13.1.jar:na]
jvm 1 | at org.ebayopensource.nexus.plugins.artifactusage.task.AetherBasedDependencyResolver.resolveDependencies(AetherBasedDependencyResolver.java:45) ~[na:na]
jvm 1 | at org.ebayopensource.nexus.plugins.artifactusage.task.DefaultArtifactUsageCalculator.calculateArtifactUsage(DefaultArtifactUsageCalculator.java:147) ~[na:na]
jvm 1 | at org.ebayopensource.nexus.plugins.artifactusage.task.DefaultArtifactUsageCalculator$ArtifactUsageCalculationWalkerProcessor.processItem(DefaultArtifactUsageCalculator.java:213) ~[na:na]
jvm 1 | at org.sonatype.nexus.proxy.walker.DefaultWalker.processItem(DefaultWalker.java:351) ~[nexus-core-2.6.0-05.jar:2.6.0-05]
jvm 1 | at org.sonatype.nexus.proxy.walker.DefaultWalker.walkItem(DefaultWalker.java:287) ~[nexus-core-2.6.0-05.jar:2.6.0-05]
jvm 1 | at org.sonatype.nexus.proxy.walker.DefaultWalker.walkRecursive(DefaultWalker.java:247) ~[nexus-core-2.6.0-05.jar:2.6.0-05]
jvm 1 | at org.sonatype.nexus.proxy.walker.DefaultWalker.walkRecursive(DefaultWalker.java:258) ~[nexus-core-2.6.0-05.jar:2.6.0-05]
jvm 1 | at org.sonatype.nexus.proxy.walker.DefaultWalker.walkRecursive(DefaultWalker.java:258) ~[nexus-core-2.6.0-05.jar:2.6.0-05]
jvm 1 | at org.sonatype.nexus.proxy.walker.DefaultWalker.walkRecursive(DefaultWalker.java:258) ~[nexus-core-2.6.0-05.jar:2.6.0-05]
jvm 1 | at org.sonatype.nexus.proxy.walker.DefaultWalker.walkRecursive(DefaultWalker.java:258) ~[nexus-core-2.6.0-05.jar:2.6.0-05]
jvm 1 | at org.sonatype.nexus.proxy.walker.DefaultWalker.walkRecursive(DefaultWalker.java:258) ~[nexus-core-2.6.0-05.jar:2.6.0-05]
jvm 1 | at org.sonatype.nexus.proxy.walker.DefaultWalker.walk(DefaultWalker.java:94) ~[nexus-core-2.6.0-05.jar:2.6.0-05]
jvm 1 | at org.ebayopensource.nexus.plugins.artifactusage.task.DefaultArtifactUsageCalculator.calculateArtifactUsage(DefaultArtifactUsageCalculator.java:114) ~[na:na]
jvm 1 | at org.ebayopensource.nexus.plugins.artifactusage.task.DefaultArtifactUsageCalculator.calculateArtifactUsage(DefaultArtifactUsageCalculator.java:67) ~[na:na]
jvm 1 | at org.ebayopensource.nexus.plugins.artifactusage.task.CalculateArtifactUsageTask.doRun(CalculateArtifactUsageTask.java:39) ~[na:na]
jvm 1 | at org.ebayopensource.nexus.plugins.artifactusage.task.CalculateArtifactUsageTask.doRun(CalculateArtifactUsageTask.java:21) ~[na:na]
jvm 1 | at org.sonatype.nexus.scheduling.AbstractNexusTask.call(AbstractNexusTask.java:177) ~[nexus-core-2.6.0-05.jar:2.6.0-05]
jvm 1 | at org.sonatype.scheduling.DefaultScheduledTask.call(DefaultScheduledTask.java:483) ~[nexus-scheduler-2.6.0-05.jar:2.6.0-05]
jvm 1 | at org.sonatype.nexus.threads.MDCAwareCallable.call(MDCAwareCallable.java:44) ~[nexus-core-2.6.0-05.jar:2.6.0-05]
jvm 1 | at org.apache.shiro.subject.support.SubjectCallable.doCall(SubjectCallable.java:90) ~[shiro-core-1.2.2.jar:1.2.2]
jvm 1 | at org.apache.shiro.subject.support.SubjectCallable.call(SubjectCallable.java:83) ~[shiro-core-1.2.2.jar:1.2.2]
jvm 1 | at java.util.concurrent.FutureTask$Sync.innerRun(FutureTask.java:334) ~[na:1.7.0_25]
jvm 1 | at java.util.concurrent.FutureTask.run(FutureTask.java:166) ~[na:1.7.0_25]
jvm 1 | at java.util.concurrent.ScheduledThreadPoolExecutor$ScheduledFutureTask.access$201(ScheduledThreadPoolExecutor.java:178) ~[na:1.7.0_25]
jvm 1 | at java.util.concurrent.ScheduledThreadPoolExecutor$ScheduledFutureTask.run(ScheduledThreadPoolExecutor.java:292) ~[na:1.7.0_25]
jvm 1 | at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1145) ~[na:1.7.0_25]
jvm 1 | at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:615) ~[na:1.7.0_25]
jvm 1 | at java.lang.Thread.run(Thread.java:724) ~[na:1.7.0_25]
jvm 1 | Caused by: java.lang.NoClassDefFoundError: org/apache/maven/wagon/shared/http/AbstractHttpClientWagon
jvm 1 | at java.lang.ClassLoader.defineClass1(Native Method) ~[na:1.7.0_25]
jvm 1 | at java.lang.ClassLoader.defineClass(ClassLoader.java:792) ~[na:1.7.0_25]
jvm 1 | at java.security.SecureClassLoader.defineClass(SecureClassLoader.java:142) ~[na:1.7.0_25]
jvm 1 | at java.net.URLClassLoader.defineClass(URLClassLoader.java:449) ~[na:1.7.0_25]
jvm 1 | at java.net.URLClassLoader.access$100(URLClassLoader.java:71) ~[na:1.7.0_25]
jvm 1 | at java.net.URLClassLoader$1.run(URLClassLoader.java:361) ~[na:1.7.0_25]
jvm 1 | at java.net.URLClassLoader$1.run(URLClassLoader.java:355) ~[na:1.7.0_25]
jvm 1 | at java.security.AccessController.doPrivileged(Native Method) ~[na:1.7.0_25]
jvm 1 | at java.net.URLClassLoader.findClass(URLClassLoader.java:354) ~[na:1.7.0_25]
jvm 1 | at org.codehaus.plexus.classworlds.realm.ClassRealm.loadClassFromSelf(ClassRealm.java:386) ~[plexus-classworlds-2.4.jar:na]
jvm 1 | at org.codehaus.plexus.classworlds.strategy.SelfFirstStrategy.loadClass(SelfFirstStrategy.java:42) ~[plexus-classworlds-2.4.jar:na]
jvm 1 | at org.codehaus.plexus.classworlds.realm.ClassRealm.loadClass(ClassRealm.java:244) ~[plexus-classworlds-2.4.jar:na]
jvm 1 | at org.codehaus.plexus.classworlds.realm.ClassRealm.loadClass(ClassRealm.java:230) ~[plexus-classworlds-2.4.jar:na]
jvm 1 | at org.sonatype.guice.bean.reflect.URLClassSpace.loadClass(URLClassSpace.java:100) ~[sisu-inject-bean-2.3.4.jar:na]
jvm 1 | ... 69 common frames omitted
jvm 1 | Caused by: java.lang.ClassNotFoundException: org.apache.maven.wagon.shared.http.AbstractHttpClientWagon
jvm 1 | at org.codehaus.plexus.classworlds.strategy.SelfFirstStrategy.loadClass(SelfFirstStrategy.java:50) ~[plexus-classworlds-2.4.jar:na]
jvm 1 | at org.codehaus.plexus.classworlds.realm.ClassRealm.loadClass(ClassRealm.java:244) ~[plexus-classworlds-2.4.jar:na]
jvm 1 | at org.codehaus.plexus.classworlds.realm.ClassRealm.loadClass(ClassRealm.java:230) ~[plexus-classworlds-2.4.jar:na]
jvm 1 | ... 83 common frames omitted
The latest stable release bundle (https://github.com/downloads/saleemshafi/nexus-artifact-usage-plugin/artifact-usage-plugin-0.8-bundle.zip) is unavailable (error 403). Should I build it from source? How?
TIA!
Hi,
Please provide a list of all required privileges to properly configure Nexus rights for users.
The following rights are granted to the developers:
Unable to authorize user [...] for read (HTTP method "GET") to /nexus/service/local/usageList/ from IP Address x.x.x.x, user agent "n/a"
If granted the Admin-role everything works fine.
Hello !
does someone have tested this plugin with a Nexus 3.8 ?
Best,
Christophe
A declarative, efficient, and flexible JavaScript library for building user interfaces.
๐ Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.
TypeScript is a superset of JavaScript that compiles to clean JavaScript output.
An Open Source Machine Learning Framework for Everyone
The Web framework for perfectionists with deadlines.
A PHP framework for web artisans
Bring data to life with SVG, Canvas and HTML. ๐๐๐
JavaScript (JS) is a lightweight interpreted programming language with first-class functions.
Some thing interesting about web. New door for the world.
A server is a program made to process requests and deliver data to clients.
Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.
Some thing interesting about visualization, use data art
Some thing interesting about game, make everyone happy.
We are working to build community through open source technology. NB: members must have two-factor auth.
Open source projects and samples from Microsoft.
Google โค๏ธ Open Source for everyone.
Alibaba Open Source for everyone
Data-Driven Documents codes.
China tencent open source team.