{"id":13565652,"url":"https://github.com/ltearno/pom-explorer","last_synced_at":"2026-01-16T07:01:27.629Z","repository":{"id":32375929,"uuid":"35952212","full_name":"ltearno/pom-explorer","owner":"ltearno","description":"A tool to aid managing lots of maven projects","archived":false,"fork":false,"pushed_at":"2023-04-13T17:18:19.000Z","size":2450,"stargazers_count":377,"open_issues_count":25,"forks_count":66,"subscribers_count":19,"default_branch":"master","last_synced_at":"2025-10-14T18:24:07.242Z","etag":null,"topics":[],"latest_commit_sha":null,"homepage":"","language":"JavaScript","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":"facebook/react","license":"mit","status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/ltearno.png","metadata":{"files":{"readme":"README.md","changelog":null,"contributing":null,"funding":null,"license":"LICENSE.md","code_of_conduct":null,"threat_model":null,"audit":null,"citation":null,"codeowners":null,"security":null,"support":null,"governance":null,"roadmap":null,"authors":null}},"created_at":"2015-05-20T14:14:22.000Z","updated_at":"2025-06-27T03:31:02.000Z","dependencies_parsed_at":"2024-01-16T18:59:41.309Z","dependency_job_id":"90010f68-374a-4674-95ef-ae3c0e29ceaf","html_url":"https://github.com/ltearno/pom-explorer","commit_stats":null,"previous_names":[],"tags_count":5,"template":false,"template_full_name":null,"purl":"pkg:github/ltearno/pom-explorer","repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/ltearno%2Fpom-explorer","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/ltearno%2Fpom-explorer/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/ltearno%2Fpom-explorer/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/ltearno%2Fpom-explorer/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/ltearno","download_url":"https://codeload.github.com/ltearno/pom-explorer/tar.gz/refs/heads/master","sbom_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/ltearno%2Fpom-explorer/sbom","scorecard":null,"host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":286080680,"owners_count":28477991,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2026-01-16T06:30:42.265Z","status":"ssl_error","status_checked_at":"2026-01-16T06:30:16.248Z","response_time":107,"last_error":"SSL_read: unexpected eof while reading","robots_txt_status":"success","robots_txt_updated_at":"2025-07-24T06:49:26.215Z","robots_txt_url":"https://github.com/robots.txt","online":false,"can_crawl_api":true,"host_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub","repositories_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories","repository_names_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repository_names","owners_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners"}},"keywords":[],"created_at":"2024-08-01T13:01:52.052Z","updated_at":"2026-01-16T07:01:27.468Z","avatar_url":"https://github.com/ltearno.png","language":"JavaScript","funding_links":[],"categories":["JavaScript"],"sub_categories":[],"readme":"# pom-explorer\n\n[![build status](https://github.com/ltearno/pom-explorer/actions/workflows/maven-publish.yml/badge.svg)](https://github.com/ltearno/pom-explorer/actions/workflows/maven-publish.yml)\n[![security status](https://www.meterian.com/badge/gh/ltearno/pom-explorer/security)](https://www.meterian.com/report/gh/ltearno/pom-explorer)\n[![stability status](https://www.meterian.com/badge/gh/ltearno/pom-explorer/stability)](https://www.meterian.com/report/gh/ltearno/pom-explorer)\n\nThe Maven's swiss knife\n\n## Description\n\nWhen a team writes a lot of maven projects, it is painful to manage versionning and connections between them. This tool helps you to update you pom graph easily.\n\nIt has several objectives:\n\n- help mind-mapping a big pom graph,\n- applying transformations on the pom graph,\n- help to detect errors and inconsistencies in a pom graph.\n- when the first objectives are implemented, the tool will also support automatically building projects which need to be build when source files are updated, in order to always have such or such project always available.\n\nMain functions :\n\n- release a graph : release a pom or all poms and its/theirs dependencies and updates all dependent poms.\n- change a gav : updates a project's gav and make all the project which depends on it follow this change.\n- manages properties, dependency management, and so on. Pom-explorer knows what pom.xml to update and where to update it. If a dependency specifies `\u003cversion\u003e${foobar.version}\u003c/version\u003e`, pom-explorer will go to update the `foobar.version` property...\n- statistics and check functions are also available...\n- displays 3d interactive graph\n- exports graphml files\n- find not used dependencies\n\nThis project is in active development and serves also as a platform to work on useful use cases that can manifest. It is used to manage the versions, connections and dependencies of 43 projects. If you have ideas or anything like that, don't hesitate to write a pull request.\n\nThis project is certainly not production ready nor really user-friendly. That's because the functionality set is not well defined yet. So any feature you need related to your pom dependency graph could be added in the feature list and will maybe impact the final architecture. So that is certainly the moment for you to say what you need in this project ! \n\n## Build and run\n\nTo build :\n\n\tmvn clean install\n\nTo run :\n\n\tjava -jar pom-explorer/target/pom-explorer.jar\n\t\nThen go with your browser on this address\n\n\thttp://localhost:8090\n\nIf you want the application to bind on a different port, you can specify the listening port like this :\n\n\tjava -jar pom-explorer/target/pom-explorer.jar PORT_NUMBER\n\nThis is the console to the application. You can type commands in the prompt, they will be sent to the server and it will answer.\n\nLet's start by typing `?` to get the available commands :\n\n![](help.png)\n\n## Analysing maven projects\n\n*If you use a specific maven configuration file, you can specify it prior to the next commands with the `session mavenSettingsFilePath String` command.*\n\nFirst, you will want to analyze some projects. Depending on where they are on your computer, you can type something like this in the application console/web page :\n\n\tanalyze directory c:\\documents\\repos\n\nThe program will analyze the directory recursively to find all the `pom.xml` files. They are then processed with the traditionnal `MavenXpp3Reader` and also resolved through the internal resolver, handing back to `ShrinkWrap` component if there is a problem. A graph is then constructed in memory representing the dependencies between projects.\n\nIf you need, you can add more analyzes by repeating the `analyze directory` command again on another directory.\n\n## Basic commands\n\nLet's have a look at the GAVs (groupId/artifactId/version) that are registered in the graph :\n\n\tgav list\n\nHere's an example of a result :\n\n![](gali.png)\n\n## Visualization of the dependency graph\n\n### 3D live graph\n\nIt is possible to visualize dynamically the graph dependency. The graph is using WebGL and allows to walk in the 3D space with the W, S, A, D, Q and E keys. It is using the VivaGraph and NGraph libraries.\n\nYou can enter the `graph` command :\n\n\t\u003e graph\n\tTo display the graph, go to : graph.html?session=1441798206\n\nThen click on the given link to see the graph for your current session.\n\n![](pomgraph.png)\n\n![](pomgraph2.png)\n\n#### The graph window\n\nIn the main part, you can navigate with W,A,S,D,E,A and the arrow keys. On the right side, you can edit javascript filters and customizers for node and links.\n\nYou can filter edges and vertices, and even change their color and\nsize with the right panel of the window. The graph is given unfiltered by the server to the client, and you can then\ncustomize what to render and how to render it.\n\nThe panel on the right side of the graph page allows to stop the animation (*the checkbox at the bottom*) and also to customize\nthe rendering. This is done by customizing javascript callback functions that are called by the rendering engine. Click the `Refresh` button\nto make your changes live.\n\nFor instance in the **confirmNode** function, you can add the following\ncode to only accept gavs containing the string \"my.groupIds' :\n\n\tif( gav.indexOf( \"my.groupIds\" ) \u003c 0 )\n\t\treturn false;\n\nThen you hit the **Refresh** button to update the graph.\n\nThere are three other functions to filter the relations\n(**confirmRelation**), to customize the node appearance (**node**) and to\ncustomize the relation appearance (**linkColor**). There are a few samples in the\npanel itself, written as code comments.\n\n### GraphML export\n\nYou can export a graphml file with the `graph export` command. This will create a .graphml file in the current directory.\n\nYou can then use this file with an editor like yEd... This will give you something like that for instance :\n\n![](graphml.png)\n\n## Finding useless dependencies\n\nAfter a long time of development, your projects might include dependencies that are not needed anymore. However, chasing those obsolete dependencies can be a long task because of the number of dependencies to analyze. Moreover, it is error prone to do it by hand.\n\nPom Explorer finds those dependencies for you. How does it do that ? There are X phases when searching useless declared dependencies in a project :\n\n- first, find all the project's dependencies (including transitive when needed or possible),\n- build a set of all java classes provided by each of those dependencies,\n- parse all the java files of the analyzed project,\n- analyze data to bring up pertinent alerts.\n\nTo analyze dependencies which are not needed by a project, use the `garbage dependencies gavFilter` command. for example :\n\n\tgarbage dependencies fr.lteconsulting:carousel:1.0-SNAPSHOT\n\nThis will launch the analyze. When finished, the results will be displayed :\n\n\tConsidered project's dependencies:\n\tcom.google.code.gson:gson:2.3.1\n\tio.undertow:undertow-servlet:1.2.6.Final\n\tjunit:junit:3.8.1\n\torg.imgscalr:imgscalr-lib:4.2\n\t\n\tJava classes provided by gav com.google.code.gson:gson:2.3.1 :\n\tresolved file : C:\\Users\\Arnaud\\.m2\\repository\\com\\google\\code\\gson\\gson\\2.3.1\\gson-2.3.1.jar\n\t165 provided classes, use -v option to display them\n\t\n\tJava classes provided by gav org.imgscalr:imgscalr-lib:4.2 :\n\tresolved file : C:\\Users\\Arnaud\\.m2\\repository\\org\\imgscalr\\imgscalr-lib\\4.2\\imgscalr-lib-4.2.jar\n\t22 provided classes, use -v option to display them\n\t\n\tJava classes provided by gav io.undertow:undertow-servlet:1.2.6.Final :\n\tresolved file : C:\\Users\\Arnaud\\.m2\\repository\\io\\undertow\\undertow-servlet\\1.2.6.Final\\undertow-servlet-1.2.6.Final.jar\n\t244 provided classes, use -v option to display them\n\t\n\tJava classes provided by gav junit:junit:3.8.1 :\n\tresolved file : C:\\Users\\Arnaud\\.m2\\repository\\junit\\junit\\3.8.1\\junit-3.8.1.jar\n\t100 provided classes, use -v option to display them\n\t\n\tJava classes provided by gav fr.lteconsulting:carousel:1.0-SNAPSHOT :\n\tresolved file : C:\\Users\\Arnaud\\.m2\\repository\\fr\\lteconsulting\\carousel\\1.0-SNAPSHOT\\carousel-1.0-SNAPSHOT.jar\n\t\n\tAnalyzing referenced fqns of the project 'C:\\documents\\repos\\carousel\\pom.xml'\n\tUse the -v option to display the list of referenced fqns.\n\tprocessing parsing java directory : C:\\documents\\repos\\carousel\\src\n\twarning : the analyzed fqns may contain false positives, because the java parsing is not fine tuned yet.\n\tAlso it does not detect references made to inner classes (that can be fixed) and through reflection (cannot be fixed), like Class.forName(...) calls.\n\tFeel free to submit a pull request !\n\tfinished : 18 directories traversed, 7 java files parsed\n\t\n\t\n\tReferenced FQNs without a provider (may include false positives, or internally defined fqns):\n\t5 not provided references found\n\tFileChannel.MapMode\n\tFileChannel.MapMode.READ_ONLY\n\tcom.google.gwt.dom.client.Element\n\tcom.google.gwt.user.client.DOM\n\tfr.lteconsulting.tarditest.client.templates.TemplateRuntime\n\t\n\tGAV declared in project's hierarchy dependencies but not referenced in the project's sources (may include false positives like imported or module poms):\n\t0 declared but not used GAVs\n\t\n\tReferenced FQNs from transitive dependencies :\n\t0 referenced transitive dependencies GAV\n\t\n\tGAV declared directly in the project's dependencies but not referenced in the project's sources (may include false positives like imported or module poms):\n\t3 declared but not used GAVs\n\tcom.google.code.gson:gson:2.3.1 (provides 165 classes)\n\tio.undertow:undertow-servlet:1.2.6.Final (provides 244 classes)\n\torg.imgscalr:imgscalr-lib:4.2 (provides 22 classes)\n\nSection by section, here is what is displayed :\n\n### Analyzed dependencies\n\n`Considered project's dependencies` section lists all the dependencies of the project which will be inspected (to find java classes that they provide).\n\n### Dependencies analysis\n\nThen each dependency is analyzed and the corresponding resolved jar file path is displayed, together with the number of classes that are provided by this dependency. You can add the `-v` flag to get the detail of those classes.\n\n### Referenced FQNs analysis\n\nThen all the java source files of the analyzed project are parsed to find which fqn they reference. Again the `-v` option will list the detail of those classes.\n\n### Not found FQNs\n\nThen a section displays the referenced FQNs without a provider. That means the fqns that were found to be referenced in the analyzed project but for which the program did not find a dependency providing this fqn. *Note that false positive can happen ! First fqn references might not reference a real class fqn, like here where FileChannel.MapMode.READ_ONLY is an enum value. Secondly, the referenced fqn might be defined in a transitive dependency of an external library, which has not been added to the dependency graph. There is a command that should be developped to solve this problem.*\n\n### Useless hierarchy dependencies\n\nThe next section displays the GAV of the dependencies from the project's hierarchy (parent poms) which are not referenced in the project's source files. This may not necessaryly mean that those dependencies should be removed, as they could be used by other projects. However, it can be a good idea to look at them.\n\n### Referenced transitive dependencies\n\nNext are the classes that are referenced but which are provided by a transitive dependency which is not directly depended on. That's a bad practice, that's why the section is here.\n\n### Useless dependencies\n\nThe last section displays the dependencies that are declared in the project's pom.xml file but which are not referenced in the java source code. Those dependencies should be looked at and one should decide whether to remove them or not, as there can be false positives. In the example, the `gson` dependency is really not needed. The `undertow-servlet` dependency is not needed, but after investigation you find that the `undertow-core` (which is transitive to `undertow-servlet`) is used because it provides the `FileChannel.MapMode` class, which was in the list of not found classes. Sometimes, you can also see dependency to jdbc drivers because they are used through a `Class.forName(...)` call.\n\n## Analysing dependencies\n\n... Documentation to be written ...\n\n## Manipulating the pom graph\n\n...\n\n## Other commands\n\n...\n\n### Changing a GAV\n\n...\n\n### Releasing \n\n...\n\n## Other\n\n...\n\n### Default script\n\nThere is a default script that can be executed when a new client connects. If a file called `welcome.commands` exists in the working directory, it will be read and executed. An example file already exists in the repository.\n\n### Default configuration\n\nIf a `config.properties` file is found in the working directory it is used to configure sessions when created. Here is the list of the possible flags :\n\n- **defaultMavenSettingsFile** : if you want to use a specific Maven configuration file, you can set its path here.\n\n## Third party libraries using pom-explorer\n- [dep-graph-releaser](https://github.com/loewenfels/dep-graph-releaser), a tool to release a project and its dependent projects.  \n  =\u003e uses `pom-explorer-core` to perform a maven project analysis \n\n## Roadmap / Todo list\n\n- manage `gradle` and `npm` projects\n- distribute builds on slaves\n- git hooks\n\n### Questions the program should answer\n\n- in a project, which are declared dependency management which are not used in a dependency ?\n- where is defined such property, available in such project ?\n\n### Functionalities\n\n- find where dependencies override demendency management\n- resolve all projects from external dependencies -\u003e download files and add them in the graph, until the last one !\n\n### Graph functionalities\n\n- aggregate pom nodes (those with same G \u0026 A but different versions, classifiers or scopes)\n- go to a specific pom\n- show multiple roads from one pom to another\n\n### Done\n\n- user wants the project X to be always build with latest dependencies. If code is modified in a depended project, required projects should be rebuilt.\n\n\n\n\n\n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fltearno%2Fpom-explorer","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Fltearno%2Fpom-explorer","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fltearno%2Fpom-explorer/lists"}