<?xml version="1.0" encoding="utf-8"?>
<rss version="2.0">
<channel>
<title>Coder Legion - Recent posts tagged dependencies</title>
<link>https://coderlegion.com/tag/dependencies</link>
<description>Powered by Question2Answer</description>
<item>
<title>Why Dependencies Are Your Biggest Security Risk</title>
<link>https://coderlegion.com/23593/why-dependencies-are-your-biggest-security-risk</link>
<description>&lt;p&gt;You install a package. It solves a problem. You move on.&lt;/p&gt;
&lt;p&gt;You do not think about it again. But that package is now part of your application. It has access to your data. It runs in your environment.&lt;/p&gt;
&lt;p&gt;If that package has a vulnerability, so do you.&lt;/p&gt;
&lt;hr&gt;
&lt;h3 id=&quot;the-numbers&quot;&gt;The Numbers&lt;/h3&gt;
&lt;p&gt;A typical Node.js project has over 500 dependencies. A Python project has over 100. A Rust project has over 50. Most developers do not know what is in their dependencies. They know the top-level packages. They do not know the transitive ones. The packages that are three levels deep. The ones that were installed by a package that was installed by a package.&lt;/p&gt;
&lt;p&gt;Those are the dangerous ones.&lt;/p&gt;
&lt;hr&gt;
&lt;h3 id=&quot;the-problem-is-not-the-maintainers&quot;&gt;The Problem Is Not The Maintainers&lt;/h3&gt;
&lt;p&gt;Most maintainers are doing their best. They fix vulnerabilities when they are reported. The problem is the volume. There are over 2 million packages on npm. Hundreds of new vulnerabilities are discovered every month.&lt;/p&gt;
&lt;p&gt;You cannot manually track all of them. You need automation.&lt;/p&gt;
&lt;hr&gt;
&lt;h3 id=&quot;what-i-do-now&quot;&gt;What I Do Now&lt;/h3&gt;
&lt;p&gt;Here is what I do.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Weekly:&lt;/strong&gt; I run a dependency scan. I look at the output. I fix critical and high severity issues.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Before every release:&lt;/strong&gt; I scan again. I make sure nothing new was introduced.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;On PRs:&lt;/strong&gt; I scan new dependencies before they are merged.&lt;/p&gt;
&lt;p&gt;It takes 5 minutes per week. It saves me from CVEs that could have taken hours to fix later.&lt;/p&gt;
&lt;hr&gt;
&lt;h3 id=&quot;the-it-is-just-a-dev-dependency-trap&quot;&gt;The &quot;It Is Just A Dev Dependency&quot; Trap&lt;/h3&gt;
&lt;p&gt;People say: &quot;It is just a dev dependency. It does not matter.&quot;&lt;/p&gt;
&lt;p&gt;But it does matter.&lt;/p&gt;
&lt;p&gt;Some dev dependencies run in CI. Some run during build. Some run during testing. If a dev dependency is compromised, your CI environment is compromised. Your build artifacts are compromised. Your secrets are exposed.&lt;/p&gt;
&lt;p&gt;Do not ignore dev dependencies.&lt;/p&gt;
&lt;hr&gt;
&lt;h3 id=&quot;what-you-can-do-today&quot;&gt;What You Can Do Today&lt;/h3&gt;
&lt;p&gt;You do not need to buy anything. You do not need to spend hours.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Run a dependency scan today.&lt;/strong&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;If you use npm: &lt;code&gt;npm audit&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;If you use Python: &lt;code&gt;pip-audit&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;If you use Rust: &lt;code&gt;cargo audit&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;If you use Go: &lt;code&gt;govulncheck&lt;/code&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;It takes 30 seconds. It tells you what is broken. Fix the critical things. Fix the high severity things. Ignore the rest.&lt;/p&gt;
&lt;p&gt;Then do it again next week.&lt;/p&gt;
&lt;hr&gt;
&lt;h3 id=&quot;the-bottom-line&quot;&gt;The Bottom Line&lt;/h3&gt;
&lt;p&gt;Your dependencies are your biggest security risk. Treat them that way. Scan them. Fix them. Ship.&lt;/p&gt;
&lt;hr&gt;
&lt;h3 id=&quot;discussion-question&quot;&gt;Discussion Question&lt;/h3&gt;
&lt;p&gt;What is the worst CVE you have found in a dependency? How did you find it?&lt;/p&gt;
</description>
<category>Discussions</category>
<guid isPermaLink="true">https://coderlegion.com/23593/why-dependencies-are-your-biggest-security-risk</guid>
<pubDate>Mon, 27 Jul 2026 13:28:06 +0000</pubDate>
</item>
<item>
<title>Automatically update GitHub Action versions</title>
<link>https://coderlegion.com/21577/automatically-update-github-action-versions</link>
<description>&lt;p&gt;You don't notice your GitHub Actions versions until you start getting warnings about things like &quot;Node 20 is no longer supported&quot;. When you think about it, GitHub Actions are &lt;em&gt;yet another&lt;/em&gt; dependency that needs to be kept up to date and present supply chain risks.&lt;/p&gt;
&lt;h3 id=&quot;get-dependabot-to-do-the-work&quot;&gt;Get Dependabot to do the work&lt;/h3&gt;
&lt;p&gt;The good news is, you can get Dependabot to keep your GitHub Actions up to date for you. You can add instructions for this to your &lt;code&gt;.github/dependabot.yml&lt;/code&gt;:&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-yaml&quot;&gt;version: 2
updates:
  - package-ecosystem: &quot;github-actions&quot;
    directory: &quot;/&quot;
    schedule:
      interval: &quot;weekly&quot;
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;In my case I already had configuration for my npm dependencies:&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-yaml&quot;&gt;version: 2
updates:
  - package-ecosystem: &quot;npm&quot;
    directory: &quot;/&quot;
    schedule:
      interval: &quot;weekly&quot;
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;But it's trivial to add multiple updates to the same file:&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-yaml&quot;&gt;version: 2
updates:
  - package-ecosystem: &quot;npm&quot;
    directory: &quot;/&quot;
    schedule:
      interval: &quot;weekly&quot;

  - package-ecosystem: &quot;github-actions&quot;
    directory: &quot;/&quot;
    schedule:
      interval: &quot;weekly&quot;
&lt;/code&gt;&lt;/pre&gt;
&lt;h3 id=&quot;automatic-pull-requests&quot;&gt;Automatic pull requests&lt;/h3&gt;
&lt;p&gt;When you first commit this file, you'll notice pull requests start appearing for your review.&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://coderlegion.com/?qa=blob&amp;amp;qa_blobid=973758743445030684&quot; alt=&quot;Dependabot pull request to update a GitHub Action version&quot;&gt;&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-yaml&quot;&gt;- name: Setup pnpm cache
    uses: actions/cache@v4 (-)
    uses: actions/cache@v5 (+)
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;This is a simple example of how you can use Dependabot to keep your GitHub Actions up to date. You can find more information about Dependabot in the &lt;a rel=&quot;nofollow&quot; href=&quot;https://docs.github.com/en/code-security/dependabot/dependabot-version-updates/about-dependabot-version-updates&quot;&gt;GitHub documentation&lt;/a&gt;.&lt;/p&gt;
</description>
<category>Articles</category>
<guid isPermaLink="true">https://coderlegion.com/21577/automatically-update-github-action-versions</guid>
<pubDate>Mon, 29 Jun 2026 14:49:47 +0000</pubDate>
</item>
<item>
<title>Getting up-and-running with Dependency-Track</title>
<link>https://coderlegion.com/16641/getting-up-and-running-with-dependency-track</link>
<description>&lt;p&gt;Since its inception in 2013, OWASP &lt;strong&gt;&lt;a rel=&quot;nofollow&quot; href=&quot;https://docs.dependencytrack.org&quot;&gt;Dependency-Track&lt;/a&gt;&lt;/strong&gt; has been at the forefront of analysing Software Bill of Materials (SBOM) for cybersecurity risk identification and reduction. &lt;strong&gt;Dependency-Track&lt;/strong&gt; allows organisations and governments to operationalise SBOM in conformance with &lt;strong&gt;&lt;a rel=&quot;nofollow&quot; href=&quot;https://docs.dependencytrack.org/usage/executive-order-14028&quot;&gt;U.S. Executive Order 14028&lt;/a&gt;&lt;/strong&gt; and more recently the European Union's &lt;strong&gt;&lt;a rel=&quot;nofollow&quot; href=&quot;https://openssf.org/blog/2025/10/22/sboms-in-the-era-of-the-cra-toward-a-unified-and-actionable-framework&quot;&gt;Cyber Resilience Act&lt;/a&gt;&lt;/strong&gt;.&lt;/p&gt;
&lt;p&gt;In a &lt;strong&gt;&lt;a rel=&quot;nofollow&quot; href=&quot;https://coderlegion.com/16252/deep-dive-into-cve-exploitation-data&quot;&gt;previous blog post&lt;/a&gt;&lt;/strong&gt; I briefly discussed how the EU's CRA requires SBOM generation across the software developer lifecycle, should be generated at build time, and should enrich the SBOM with vulnerability data in order to demonstrate whether a given software dependency or library is likely to be exploited or not. When talking about SBOMs, there are 2 industry-recognised formats - &lt;strong&gt;&lt;a rel=&quot;nofollow&quot; href=&quot;https://spdx.dev&quot;&gt;SPDX&lt;/a&gt;&lt;/strong&gt; (under the Linux Foundation) and &lt;strong&gt;&lt;a rel=&quot;nofollow&quot; href=&quot;https://cyclonedx.org&quot;&gt;CycloneDX&lt;/a&gt;&lt;/strong&gt; (maintained by OWASP). Dependency-track specifically supports the OWASP CycloneDX BOM format, which is defined in the &lt;strong&gt;&lt;a rel=&quot;nofollow&quot; href=&quot;https://www.ntia.gov/sites/default/files/publications/sbom_minimum_elements_report_0.pdf&quot;&gt;NTIA Minimum Elements&lt;/a&gt;&lt;/strong&gt; for SBOMs.&lt;/p&gt;
&lt;h3 id=&quot;so-what-does-dependency-track-do-&quot;&gt;So what does Dependency-Track do?&lt;/h3&gt;
&lt;p&gt;Dependency-track consumes and analyses the SBOMs we just mentioned for known security, operational, and license-related risks. The tool is ideal for use in procurement and continuous integration and delivery environments - which is crucial when trying to meet the requirements of the US EO14028 or the EU CRA. Dependency-track supports the OWASP CycloneDX Vulnerability Exploitability Exchange (&lt;strong&gt;&lt;a rel=&quot;nofollow&quot; href=&quot;https://cyclonedx.org/capabilities/vex&quot;&gt;VEX&lt;/a&gt;&lt;/strong&gt;) format exceeding the existing VEX requirements defined by CISA.&lt;/p&gt;
&lt;p&gt;In short, dependency-track is an intelligent &lt;strong&gt;Component Analysis&lt;/strong&gt; platform that allows organisations to identify and reduce risk in the software supply chain. Dependency-Track takes a unique and highly beneficial approach by leveraging the capabilities of the existing SBOM, an approach that provides capabilities that traditional Software Composition Analysis (&lt;strong&gt;&lt;a rel=&quot;nofollow&quot; href=&quot;https://en.wikipedia.org/wiki/Software_composition_analysis&quot;&gt;SCA&lt;/a&gt;&lt;/strong&gt;) solutions cannot achieve.&lt;/p&gt;
&lt;p&gt;Dependency-Track monitors component usage across all versions of every application in its portfolio in order to proactively identify risk across an organisation. The platform has an API-first design and is ideal for use in CI/CD environments. And that's what we'll demonstrate in this short blog post.&lt;/p&gt;
&lt;h3 id=&quot;how-to-install-dependency-track&quot;&gt;How to install Dependency-Track&lt;/h3&gt;
&lt;p&gt;There are a bunch of ways to install or deploy dependency-track - either as a Kubernetes workload via Helm, or as a standalone executable. I opted for the simple &lt;strong&gt;&lt;a rel=&quot;nofollow&quot; href=&quot;https://docs.dependencytrack.org/getting-started/deploy-docker&quot;&gt;Docker Compose&lt;/a&gt;&lt;/strong&gt; quickstart.&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;curl -LO https://dependencytrack.org/docker-compose.yml
docker-compose up -d
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;This install was super quick. I was then able to access to the locally-hosted GUI via the below URL. By default, the dependency-track frontend runs on &lt;code&gt;port 8080&lt;/code&gt;.&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;URL:&lt;/strong&gt; &lt;a rel=&quot;nofollow&quot; href=&quot;http://localhost:8080&quot;&gt;http://localhost:8080&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Username:&lt;/strong&gt; admin&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Password:&lt;/strong&gt; admin&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;First Step: It will immediately force you to change that password. Pick something secure and log back in.&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://docs.dind.io/assets/images/dependency-track06-289e88f08139b3a7987a339f4199546d.png&quot; alt=&quot;&quot;&gt;&lt;/p&gt;
&lt;h3 id=&quot;building-an-sbom&quot;&gt;Building an SBOM&lt;/h3&gt;
&lt;p&gt;Since this is a quickstart guide, we will go down the manual workflow. But realistically you will be looking to automate this entire workflow through &lt;strong&gt;&lt;a rel=&quot;nofollow&quot; href=&quot;https://docs.dependencytrack.org/usage/cicd&quot;&gt;CI/CD&lt;/a&gt;&lt;/strong&gt;. The first thing we need to do is create an SBOM. There are various scanners such as Trivy and Grype to achieve this, so I'll be using &lt;strong&gt;&lt;a rel=&quot;nofollow&quot; href=&quot;https://edu.chainguard.dev/chainguard/chainguard-images/staying-secure/working-with-scanners/grype-tutorial&quot;&gt;Grype&lt;/a&gt;&lt;/strong&gt;.&lt;/p&gt;
&lt;p&gt;In the below command, the Grype scanner pulls the &lt;strong&gt;&lt;a rel=&quot;nofollow&quot; href=&quot;https://hub.docker.com/r/ollama/ollama&quot;&gt;Ollama image&lt;/a&gt;&lt;/strong&gt; from Docker Hub, on version &lt;code&gt;0.1.32&lt;/code&gt;. Notice how the report is exported in output (&lt;code&gt;-o&lt;/code&gt;) of &lt;code&gt;CycloneDX&lt;/code&gt; JSON.&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;grype ollama/ollama:0.1.32 -o cyclonedx-json &amp;gt; ollama_v0.1.32.json
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;The file itself is called &lt;strong&gt;&lt;a rel=&quot;nofollow&quot; href=&quot;https://github.com/ndouglas-cloudsmith/hunt-the-malicious-package/blob/main/ollama_v0.1.32.json&quot;&gt;ollama_v0.1.32.json&lt;/a&gt;&lt;/strong&gt; - I decided to add the full SBOM output for one random Docker Image SBOM just to give you an idea of how much information is contained within these SBOMs. In the below snippet, we can the format, and version of the format that created this SBOM. We get a component for the scanned image, but also for the scanner itself. What makes the SBOM so long, and ultimately hard to read, is all the software dependencies and transitive dependencies of those software dependencies that we ultimately did not write. They are just small chunks of code baked into the layers of this Ollama Docker Image.&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;{
  &quot;$schema&quot;: &quot;http://cyclonedx.org/schema/bom-1.6.schema.json&quot;,
  &quot;bomFormat&quot;: &quot;CycloneDX&quot;,
  &quot;specVersion&quot;: &quot;1.6&quot;,
  &quot;serialNumber&quot;: &quot;urn:uuid:fc5a8286-c9dc-4785-8de0-7ff703ebcf98&quot;,
  &quot;version&quot;: 1,
  &quot;metadata&quot;: {
    &quot;timestamp&quot;: &quot;2026-05-04T12:17:33+01:00&quot;,
    &quot;tools&quot;: {
      &quot;components&quot;: [
        {
          &quot;type&quot;: &quot;application&quot;,
          &quot;author&quot;: &quot;anchore&quot;,
          &quot;name&quot;: &quot;grype&quot;,
          &quot;version&quot;: &quot;0.100.0&quot;
        }
      ]
    },
    &quot;component&quot;: {
      &quot;bom-ref&quot;: &quot;56a120ff045b7287&quot;,
      &quot;type&quot;: &quot;container&quot;,
      &quot;name&quot;: &quot;ollama/ollama&quot;,
      &quot;version&quot;: &quot;0.1.32&quot;
    },
    &quot;properties&quot;: [
      {
        &quot;name&quot;: &quot;syft:image:labels:org.opencontainers.image.ref.name&quot;,
        &quot;value&quot;: &quot;ubuntu&quot;
      },
      {
        &quot;name&quot;: &quot;syft:image:labels:org.opencontainers.image.version&quot;,
        &quot;value&quot;: &quot;22.04&quot;
      }
    ]
  },
&lt;/code&gt;&lt;/pre&gt;
&lt;h3 id=&quot;pushing-an-sbom-to-dependency-track&quot;&gt;Pushing an SBOM to dependency-track&lt;/h3&gt;
&lt;p&gt;To publish CycloneDX BOMs, use a &lt;strong&gt;&lt;a rel=&quot;nofollow&quot; href=&quot;https://docs.dependencytrack.org/usage/cicd/#:~:text=use%20a%20valid%20API%20Key%20and%20project%20UUID&quot;&gt;valid API Key&lt;/a&gt;&lt;/strong&gt; and Project UUID. Finally, Base64 encode the BOM and insert the resulting text into the ‘&lt;code&gt;bom&lt;/code&gt;’ field. Since this is a test workflow, and we don't have any project's created, and therefore no associated Project UUID, we can create all this only the fly without any need for Base64-encoding. We simply push the &lt;code&gt;ollama_v0.1.32.json&lt;/code&gt; file to the dependency track API with our newly-created API;&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;curl -X &quot;POST&quot; &quot;http://localhost:8081/api/v1/bom&quot; \
     -H 'Content-Type: multipart/form-data' \
     -H &quot;X-Api-Key: $DTRACK_API_KEY&quot; \
     -F &quot;autoCreate=true&quot; \
     -F &quot;projectName=ollama&quot; \
     -F &quot;projectVersion=0.1.32&quot; \
     -F &quot;bom=@ollama_v0.1.32.json&quot;
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;For GitHub workflow environments the &lt;strong&gt;&lt;a rel=&quot;nofollow&quot; href=&quot;https://github.com/marketplace/actions/upload-bom-to-dependency-track&quot;&gt;Dependency-Track GitHub Action&lt;/a&gt;&lt;/strong&gt; is recommended.&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://i.imgur.com/wFO3Dg8.png&quot; alt=&quot;&quot;&gt;&lt;/p&gt;
&lt;h3 id=&quot;vulnerability-intelligence&quot;&gt;Vulnerability Intelligence&lt;/h3&gt;
&lt;p&gt;If using a vulnerability scanner like Grype, you might notice that the vulnerability data doesn't always match exactly the same in dependency-track. As you can see from the output of Grype scanner, I have &lt;strong&gt;3 Critical&lt;/strong&gt; and &lt;strong&gt;22 High&lt;/strong&gt; severity vulnerabilities associated with that Ollama docker image.&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://i.imgur.com/BkCt47B.png&quot; alt=&quot;&quot;&gt;&lt;/p&gt;
&lt;p&gt;In the dependency-track UI, we see &lt;strong&gt;4 Critical&lt;/strong&gt; and &lt;strong&gt;15 High&lt;/strong&gt;. Definitely not the same result from our Grype scanner during SBOM generation.&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://i.imgur.com/LAcCHXU.png&quot; alt=&quot;&quot;&gt;&lt;/p&gt;
&lt;p&gt;It usually boils down to a difference in &lt;strong&gt;Vulnerability Databases&lt;/strong&gt; and &lt;strong&gt;Matching Logic&lt;/strong&gt;. While both tools are looking at the same SBOM, they are using different informed data to interpret it.&lt;/p&gt;
&lt;p&gt;Uses its own proprietary database (&lt;a rel=&quot;nofollow&quot; href=&quot;https://github.com/anchore/vunnel&quot;&gt;&lt;strong&gt;vunnel&lt;/strong&gt;&lt;/a&gt;), which aggregates data from the NVD, GitHub Advisories, and specific Linux distro feeds (like Ubuntu or Alpine security trackers). Whereas, dependency-track usually relies on the &lt;strong&gt;[NVD][17]&lt;/strong&gt; (National Vulnerability Database) via API and the GitHub Advisory Database - which probably explains why the data is not correct. Happy for people to provide surrounding context here in the comments.&lt;/p&gt;
&lt;p&gt;My other theory is that a vulnerability might be a critical (9.8) in one tool using CVSS v3.1, but the other tool might still be displaying the CVSS v2 score, which might only be a High (7.5). Dependency-track apparently allows you to toggle which scoring method you want to prioritise in its settings, so this is something I will explore further.&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://i.imgur.com/te7md03.png&quot; alt=&quot;&quot;&gt;&lt;/p&gt;
&lt;h3 id=&quot;exploit-prediction-scoring-system-epss-&quot;&gt;Exploit Prediction Scoring System (EPSS)&lt;/h3&gt;
&lt;p&gt;The &lt;strong&gt;&lt;a rel=&quot;nofollow&quot; href=&quot;https://github.com/DependencyTrack/dependency-track/discussions/2632&quot;&gt;EPSS&lt;/a&gt;&lt;/strong&gt; (exploitability) vs. CVSS (generic vulnerability scoring) might be a little confusing at first. While a CVSS score is a point-in-time score, and is often not updated in those NVD records, the EPSS score is designed as an ML Model to continuously update on a daily basis, globally, to look at the likelihood of being exploited - based on evolving environmental factors. If a specific CVE is getting exploited in the wild, the chances of this CVE being exploited in your environment naturally goes up - even if the CVSS score never changes. I wrote a dedicated &lt;strong&gt;&lt;a rel=&quot;nofollow&quot; href=&quot;https://cloudsmith.com/blog/vulnerability-scoring-systems&quot;&gt;Cloudsmith blog post&lt;/a&gt;&lt;/strong&gt; on the difference between these existing scoring systems.&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://i.imgur.com/6wr366K.png&quot; alt=&quot;&quot;&gt; &lt;/p&gt;
&lt;h3 id=&quot;vex-reporting&quot;&gt;VEX Reporting&lt;/h3&gt;
&lt;p&gt;The &lt;strong&gt;[VEX documentation][20]&lt;/strong&gt; is kinda limited in the official dependency-track docs. As a result, I will write a separate, dedicated blog post on VEX that goes outside of the scope of this similar getting started guide. We'll talk about VEX in more details, and why applying analyses from a VEX document to this project is critical will help us meet the requirements of CRA without constantly panicking about new CVE IDs.&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://i.imgur.com/BA2cEcu.png&quot; alt=&quot;&quot;&gt;&lt;/p&gt;
&lt;p&gt;Unlike EPSS alone, understanding the genuine impact of vulnerabilities is essential for risk management, and CycloneDX achieves this by representing exploitability data through VEX. Unlike general vulnerability disclosures, VEX focuses on whether a vulnerability in a component can actually be exploited in its specific context. This clarity helps organisations prioritise responses, reducing unnecessary mitigation efforts and ensuring resources are focused on critical risks.&lt;/p&gt;
&lt;p&gt;Hope you enjoyed this blog post!&lt;/p&gt;
</description>
<category>Tutorials</category>
<guid isPermaLink="true">https://coderlegion.com/16641/getting-up-and-running-with-dependency-track</guid>
<pubDate>Mon, 04 May 2026 21:24:20 +0000</pubDate>
</item>
<item>
<title>DevLog 20250706: Analyzing (C#) Project Dependencies</title>
<link>https://coderlegion.com/3738/devlog-20250706-analyzing-c-project-dependencies</link>
<description>&lt;p&gt;When a code project grows complex it's going to be difficult to understand which depends on which - developers familiar with the C# ecosystem can look at NuGet Package Manager and use &lt;code&gt;.csproj&lt;/code&gt; to try to study things but when the hierarchy gets complex it can feel inconvenient.&lt;/p&gt;
&lt;p&gt;For instance, say I have a top-level entry program that I know ultimately depends on &lt;code&gt;Mathnet.Numerics&lt;/code&gt; - now I need to figure out which subproject references it.&lt;/p&gt;
&lt;h3 id=&quot;the-general-approach&quot;&gt;The General Approach&lt;/h3&gt;
&lt;p&gt;To view which project depend on which package in C#, below are some approaches using existing tools.&lt;/p&gt;
&lt;h4 id=&quot;1-using-the-net-cli&quot;&gt;1. Using the .NET CLI&lt;/h4&gt;
&lt;p&gt;This approach only shows the NuGet packages the projects depend on.&lt;/p&gt;
&lt;h5 id=&quot;a-list-packages-per-project&quot;&gt;a) List packages per project&lt;/h5&gt;
&lt;p&gt;Run, for each project:&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-bash&quot;&gt;dotnet list path/to/MyProject.csproj package
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;We'll get an &lt;em&gt;&quot;Installed&quot;&lt;/em&gt; section showing direct references.&lt;/p&gt;
&lt;h5 id=&quot;b-include-transitive-dependencies&quot;&gt;b) Include transitive dependencies&lt;/h5&gt;
&lt;pre&gt;&lt;code class=&quot;language-bash&quot;&gt;dotnet list path/to/MyProject.csproj package --include-transitive
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;This will also show packages pulled in by other packages.&lt;/p&gt;
&lt;h5 id=&quot;c-script-it-for-the-entire-solution&quot;&gt;c) Script it for the entire solution&lt;/h5&gt;
&lt;p&gt;On &lt;strong&gt;bash&lt;/strong&gt; (Linux/macOS/git-bash):&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-bash&quot;&gt;for proj in $(find . -name '*.csproj'); do
  echo &quot;== $proj ==&quot;  
  dotnet list &quot;$proj&quot; package --include-transitive | grep MathNet.Numerics -B2 -A2
done
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;On &lt;strong&gt;PowerShell&lt;/strong&gt; (Windows):&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-powershell&quot;&gt;Get-ChildItem -Recurse -Filter *.csproj |
  ForEach-Object {
    Write-Host &quot;== $($_.FullName) ==&quot;
    dotnet list $_.FullName package --include-transitive |
      Select-String &quot;MathNet.Numerics&quot; -Context 2,2
  }
&lt;/code&gt;&lt;/pre&gt;
&lt;h4 id=&quot;2-grep-select-string-on-csproj-files&quot;&gt;2. Grep / Select-String on &lt;code&gt;.csproj&lt;/code&gt; files&lt;/h4&gt;
&lt;p&gt;Since NuGet package references live in &lt;code&gt;&amp;lt;PackageReference&amp;gt;&lt;/code&gt; items, we can search directly:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;bash&lt;/strong&gt;:&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-bash&quot;&gt;grep -R &quot;PackageReference.*MathNet\.Numerics&quot; -n .
&lt;/code&gt;&lt;/pre&gt;
&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;PowerShell&lt;/strong&gt;:&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-powershell&quot;&gt;Get-ChildItem -Path . -Filter *.csproj -Recurse | Select-String -Pattern 'MathNet\.Numerics' -List
  
# Or
Get-ChildItem -Recurse -Filter *.csproj | Select-String -SimpleMatch 'MathNet.Numerics' -List
&lt;/code&gt;&lt;/pre&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;That will show us exactly which project files reference it.&lt;/p&gt;
&lt;p&gt;Alternatively, just do a full text search in VS Code with file type filter.&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://dev-to-uploads.s3.amazonaws.com/uploads/articles/z8u46rq4ltd19lj807dg.png&quot; alt=&quot;Search in VS Code&quot;&gt;&lt;/p&gt;
&lt;h4 id=&quot;3-visual-studio-rider-ui&quot;&gt;3. Visual Studio / Rider UI&lt;/h4&gt;
&lt;ol&gt;
&lt;li&gt;&lt;strong&gt;Right-click&lt;/strong&gt; on the &lt;strong&gt;Solution&lt;/strong&gt; → &lt;strong&gt;Manage NuGet Packages for Solution…&lt;/strong&gt;&lt;/li&gt;
&lt;li&gt;Go to the &lt;strong&gt;Installed&lt;/strong&gt; tab, find &lt;strong&gt;MathNet.Numerics&lt;/strong&gt; in the left panel.&lt;/li&gt;
&lt;li&gt;On the right, we'll see checkboxes or project-scoped lists showing which projects have it installed.&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;Once again, this method doesn't show the complete picture or the hierarchy of dependencies.&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://dev-to-uploads.s3.amazonaws.com/uploads/articles/6jjn66fa19sld80ymobr.png&quot; alt=&quot;Manage NuGets for Entire Solution&quot;&gt;&lt;/p&gt;
&lt;h4 id=&quot;4-msbuild-dependency-graph-advanced-&quot;&gt;4. MSBuild Dependency Graph (advanced)&lt;/h4&gt;
&lt;p&gt;If we need to audit &lt;strong&gt;transitive&lt;/strong&gt; and &lt;strong&gt;project-to-project&lt;/strong&gt; dependencies in one go, we can generate a restore graph:&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-bash&quot;&gt;dotnet msbuild /t:GenerateRestoreGraphFile /p:RestoreGraphOutputPath=graph.dg
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;This produce a fairly comprehensive output that contains absolute paths and a bit too much irrelevant information.&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://dev-to-uploads.s3.amazonaws.com/uploads/articles/qzkdw17u1njkamxsekus.png&quot; alt=&quot;graph.dh&quot;&gt;&lt;/p&gt;
&lt;p&gt;Then inspect &lt;code&gt;graph.dg&lt;/code&gt; (JSON) for entries where &lt;code&gt;&quot;PackageId&quot;:&quot;MathNet.Numerics&quot;&lt;/code&gt; and note the &lt;code&gt;&quot;ProjectPath&quot;&lt;/code&gt; fields.&lt;/p&gt;
&lt;h3 id=&quot;custom-tool&quot;&gt;Custom Tool&lt;/h3&gt;
&lt;p&gt;Above methods work but if you don't like the output format, CLI syntax, or just want something more straightforward - then it's time for a custom tool.&lt;/p&gt;
&lt;p&gt;The &lt;a rel=&quot;nofollow&quot; href=&quot;https://github.com/MethodoxTech/Mirror_Tool_CSharpDependencyAnalyzer&quot;&gt;C# Dependency Analyzer&lt;/a&gt; is a tool that can quickly help identify dependencies of a source code project. This is useful in identifying unwanted nuget dependencies from any given entry assembly. It is equivalent to manually searching through .csproj to find which projects depend on which and debug NuGet dependencies.&lt;/p&gt;
&lt;p&gt;It can do those three things:&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;Print an exhaustive dependency tree with a root node at each source project level down to all dependent projects and most importantly the root NuGets&lt;/li&gt;
&lt;li&gt;Given a single target project/nuget, prints a filtered tree of all projects that depend on that assembly&lt;/li&gt;
&lt;li&gt;Given a single target project/nuget and a source assembly, it prints the tree paths that lead from the source assembly to the target - showing clearly the path from the source assembly to the ultimate dependency.&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;Below is an example output with command: &lt;code&gt;path --path &amp;lt;solution path&amp;gt; --source Transcriber --target SkiaSharp&lt;/code&gt;&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://dev-to-uploads.s3.amazonaws.com/uploads/articles/phyw6tk6u14u30hit0l6.png&quot; alt=&quot;Dependency look up&quot;&gt;&lt;/p&gt;
&lt;h3 id=&quot;references&quot;&gt;References&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;Methodox Dependency analyzer: visit &lt;a rel=&quot;nofollow&quot; href=&quot;https://github.com/MethodoxTech/Mirror_Tool_CSharpDependencyAnalyzer&quot;&gt;Github&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
</description>
<category>C#</category>
<guid isPermaLink="true">https://coderlegion.com/3738/devlog-20250706-analyzing-c-project-dependencies</guid>
<pubDate>Sun, 06 Jul 2025 19:26:37 +0000</pubDate>
</item>
<item>
<title>Improving Maven's dependency:analyze... or not</title>
<link>https://coderlegion.com/1430/improving-mavens-dependency-analyze-or-not</link>
<description>&lt;p&gt;Recently, my good friend Richard Fichtner advised using the &lt;code&gt;mvn dependency:analyze&lt;/code&gt; command to get rid of declared but unused dependencies:&lt;/p&gt;
&lt;blockquote class=&quot;bluesky-embed&quot; data-bluesky-uri=&quot;at://did:plc:cc2k5egfzqpf3nbjrs5xox4r/app.bsky.feed.post/3lcxfnsc2h62m&quot; data-bluesky-cid=&quot;bafyreifttkfkj7y22l5ezheiy5jclf4aooekvw5rirlprupknwtk7fklxq&quot;&gt;&lt;p lang=&quot;&quot;&gt;There is another use case for

mvn dependency:analyze

It can show you the dependencies you use in your code but have not declared in your pom.xml. This works because you have a transitive dependency on your classpath. Either don't use the dependency or declare it.&lt;br&gt;&lt;br&gt;&lt;a rel=&quot;nofollow&quot; href=&quot;https://bsky.app/profile/did:plc:cc2k5egfzqpf3nbjrs5xox4r/post/3lcxfnsc2h62m?ref_src=embed&quot;&gt;[image or embed]&lt;/a&gt;&lt;/p&gt;&lt;div&gt;— Richard Fichtner ????☕ (&lt;/div&gt;&lt;a rel=&quot;nofollow&quot; href=&quot;https://bsky.app/profile/did:plc:cc2k5egfzqpf3nbjrs5xox4r?ref_src=embed&quot;&gt;@richard.fichtner.dev&lt;/a&gt;&lt;div&gt;) &lt;/div&gt;&lt;a rel=&quot;nofollow&quot; href=&quot;https://bsky.app/profile/did:plc:cc2k5egfzqpf3nbjrs5xox4r/post/3lcxfnsc2h62m?ref_src=embed&quot;&gt;December 10, 2024 at 2:00 PM&lt;/a&gt;&lt;/blockquote&gt;
&lt;p&gt;While it was a great idea years ago, it's dangerous advice today. In this post, I'd like to explain what the plugin does and why you shouldn't use it but in the most straightforward projects.&lt;/p&gt;
&lt;h3 id=&quot;the-mvn-dependency-analyze-command&quot;&gt;The &lt;code&gt;mvn dependency:analyze&lt;/code&gt; command&lt;/h3&gt;
&lt;p&gt;Maven uses a plugin architecture; in the above command, the plugin is &lt;a rel=&quot;nofollow&quot; href=&quot;https://github.com/apache/maven-dependency-plugin&quot;&gt;maven-dependency-plugin&lt;/a&gt;. A plugin hosts several related &lt;em&gt;goals&lt;/em&gt;. Here, it's &lt;code&gt;analyze&lt;/code&gt;.&lt;/p&gt;
&lt;p&gt;&amp;gt;Analyzes the dependencies of this project and determines which are: used and declared; used and undeclared; unused and declared. This goal is intended to be used standalone, thus it always executes the &lt;code&gt;test-compile&lt;/code&gt; phase - use the&lt;code&gt; dependency:analyze-only&lt;/code&gt; goal instead when participating in the build lifecycle.&lt;br&gt;
&amp;gt;By default, &lt;code&gt;maven-dependency-analyzer&lt;/code&gt; is used to perform the analysis, with limitations due to the fact that it works at bytecode level, but any analyzer can be plugged in through &lt;code&gt;analyzer&lt;/code&gt; parameter.&lt;br&gt;
&amp;gt;-- &lt;a rel=&quot;nofollow&quot; href=&quot;https://maven.apache.org/plugins/maven-dependency-plugin/analyze-mojo.html&quot;&gt;dependency:analyze&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;&lt;code&gt;maven-dependency-analyzer&lt;/code&gt; is a shared Maven component. Its description is quite descriptive:&lt;/p&gt;
&lt;p&gt;&amp;gt;Analyzes the dependencies of a project for undeclared or unused artifacts.&lt;br&gt;
&amp;gt;&lt;em&gt;Warning&lt;/em&gt;: Because analysis is done on the bytecode rather than the source, some cases are not detected including constants, annotations with source-only retention, and links in Javadoc. This can lead to incorrect results when these are the only uses of a dependency.&lt;br&gt;
&amp;gt;The main component is &lt;code&gt;ProjectDependencyAnalyzer&lt;/code&gt;, which uses &lt;code&gt;ClassAnalyzer&lt;/code&gt; and &lt;code&gt;DependencyAnalyzer&lt;/code&gt;.&lt;br&gt;
&amp;gt;-- &lt;a rel=&quot;nofollow&quot; href=&quot;https://maven.apache.org/shared/maven-dependency-analyzer/&quot;&gt;maven-dependency-analyzer&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;The warning clearly shows that it works at the &lt;em&gt;bytecode&lt;/em&gt; level. In particular, it explicitly mentions that it doesn't consider source-level annotations.&lt;/p&gt;
&lt;h3 id=&quot;spring-boot-starters&quot;&gt;Spring Boot starters&lt;/h3&gt;
&lt;p&gt;I described how to &lt;a rel=&quot;nofollow&quot; href=&quot;https://blog.frankel.ch/designing-your-own-spring-boot-starter/1/&quot;&gt;design your own&lt;/a&gt; &lt;a rel=&quot;nofollow&quot; href=&quot;https://blog.frankel.ch/designing-your-own-spring-boot-starter/2/&quot;&gt;Spring Boot starter&lt;/a&gt; a long time ago, and it didn't change a lot since then. If you're new to Spring Boot starters, here's a summary.&lt;/p&gt;
&lt;p&gt;SpringBoot relies on AutoConfiguration classes. AutoConfiguration classes are regular configuration classes, &lt;em&gt;i.e.&lt;/em&gt;, they contribute to the application classes. You can set specific activation criteria, such as the presence of a Spring property, but these are not specific to auto-configuration.&lt;/p&gt;
&lt;p&gt;Here's a very simplified flow:&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://blog.frankel.ch/assets/generated/maven-dependency-analyze/spring-autoconfiguration-init.svg&quot; alt=&quot;Simplified sequence diagram of the auto-configuration in Spring Boot&quot;&gt;&lt;/p&gt;
&lt;p&gt;The JAR that automatically comes with Spring Boot is &lt;code&gt;org.springframework.boot:spring-boot-autoconfigure&lt;/code&gt;. You can check the content of its &lt;code&gt;META-INF/spring/org.springframework.boot.autoconfigure.AutoConfiguration.imports&lt;/code&gt;:&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;...
org.springframework.boot.autoconfigure.web.client.RestClientAutoConfiguration
org.springframework.boot.autoconfigure.web.client.RestTemplateAutoConfiguration
org.springframework.boot.autoconfigure.web.embedded.EmbeddedWebServerFactoryCustomizerAutoConfiguration
org.springframework.boot.autoconfigure.web.reactive.HttpHandlerAutoConfiguration
org.springframework.boot.autoconfigure.web.reactive.ReactiveMultipartAutoConfiguration
org.springframework.boot.autoconfigure.web.reactive.ReactiveWebServerFactoryAutoConfiguration
org.springframework.boot.autoconfigure.web.reactive.WebFluxAutoConfiguration
org.springframework.boot.autoconfigure.web.reactive.WebSessionIdResolverAutoConfiguration
org.springframework.boot.autoconfigure.web.reactive.error.ErrorWebFluxAutoConfiguration
org.springframework.boot.autoconfigure.web.reactive.function.client.ClientHttpConnectorAutoConfiguration
org.springframework.boot.autoconfigure.web.reactive.function.client.WebClientAutoConfiguration
org.springframework.boot.autoconfigure.web.servlet.DispatcherServletAutoConfiguration
org.springframework.boot.autoconfigure.web.servlet.ServletWebServerFactoryAutoConfiguration
org.springframework.boot.autoconfigure.web.servlet.error.ErrorMvcAutoConfiguration
org.springframework.boot.autoconfigure.web.servlet.HttpEncodingAutoConfiguration
org.springframework.boot.autoconfigure.web.servlet.MultipartAutoConfiguration
org.springframework.boot.autoconfigure.web.servlet.WebMvcAutoConfiguration
org.springframework.boot.autoconfigure.websocket.reactive.WebSocketReactiveAutoConfiguration
org.springframework.boot.autoconfigure.websocket.servlet.WebSocketServletAutoConfiguration
org.springframework.boot.autoconfigure.websocket.servlet.WebSocketMessagingAutoConfiguration
org.springframework.boot.autoconfigure.webservices.WebServicesAutoConfiguration
org.springframework.boot.autoconfigure.webservices.client.WebServiceTemplateAutoConfiguration
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;As an example, here's the &lt;code&gt;RestClientAutoConfiguration&lt;/code&gt;:&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;@AutoConfiguration(after = { HttpClientAutoConfiguration.class, HttpMessageConvertersAutoConfiguration.class }) //1
@ConditionalOnClass(RestTemplate.class)                //2
@Conditional(NotReactiveWebApplicationCondition.class) //3
public class RestTemplateAutoConfiguration {

    // Class body
}
&lt;/code&gt;&lt;/pre&gt;
&lt;ol&gt;
&lt;li&gt;Set the order of auto-configuration classes&lt;/li&gt;
&lt;li&gt;Activate if the &lt;code&gt;RestTemplate&lt;/code&gt; class is on the classpath&lt;/li&gt;
&lt;li&gt;Activate if we aren't in a reactive web app context&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;Note that the class loader loads the &lt;code&gt;RestTemplateAutoConfiguration&lt;/code&gt; class just fine, &lt;em&gt;regardless of whether the &lt;code&gt;RestTemplate&lt;/code&gt; class is on the classpath or not&lt;/em&gt;! Spring leverages this mechanism to its fullest, as seen above. In effect, the resolution of classes configured in annotations is deferred until they are &lt;em&gt;explicitly&lt;/em&gt; accessed.&lt;/p&gt;
&lt;h3 id=&quot;bringing-the-maven-dependency-analyzer-into-the-modern-age&quot;&gt;Bringing the &lt;code&gt;maven-dependency-analyzer&lt;/code&gt; into the modern age&lt;/h3&gt;
&lt;p&gt;Committers designed the analyzer in 2007: &lt;a rel=&quot;nofollow&quot; href=&quot;https://github.com/apache/maven-dependency-analyzer/tree/b448d95daba17db67bc071eab9a1dd2457b77cab&quot;&gt;here's&lt;/a&gt; how it looked like then. Spring Boot started later, in 2010. For this reason, the analyzer didn't take deferred class loading in annotations. Note that this is still not the case; the project doesn't get a lot of love.&lt;/p&gt;
&lt;p&gt;When using the plugin on a Spring Boot project, you'll get a lot of false positives. I tried it with a simple Spring Boot project, using WebFlux and R2DBC on PostgreSQL.&lt;/p&gt;
&lt;p&gt;Here's a slight excerpt of the output when I run &lt;code&gt;mvn analyze:dependencies&lt;/code&gt;:&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;[WARNING] Unused declared dependencies found:
[WARNING]   org.springframework.boot:spring-boot-starter-data-r2dbc:jar:3.4.0:compile
[WARNING]   org.testcontainers:postgresql:jar:1.20.4:test
[WARNING]   org.testcontainers:r2dbc:jar:1.20.4:test
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;If I remove any of these dependencies, tests don't run.&lt;/p&gt;
&lt;p&gt;What would be necessary to make the analyzer work with Spring Boot projects?&lt;br&gt;
Let's analyze the analyzer.&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://blog.frankel.ch/assets/generated/maven-dependency-analyze/analyzer-class-diagram.svg&quot; alt=&quot;Analyzer class diagram&quot;&gt;&lt;/p&gt;
&lt;p&gt;The plugin allows configuring another analyzer:&lt;/p&gt;
&lt;p&gt;&amp;gt;&lt;strong&gt;&lt;/strong&gt;&lt;br&gt;
&amp;gt;Specify the project dependency analyzer to use (plexus component role-hint). By default, maven-dependency-analyzer is used. To use this, you must declare a dependency for this plugin that contains the code for the analyzer. The analyzer must have a declared Plexus role name, and you specify the role name here.&lt;br&gt;
&amp;gt;&lt;em&gt; &lt;strong&gt;Type&lt;/strong&gt;: &lt;code&gt;java.lang.String&lt;/code&gt;&lt;br&gt;
&amp;gt;&lt;/em&gt; &lt;strong&gt;Since&lt;/strong&gt;: &lt;code&gt;2.2&lt;/code&gt;&lt;br&gt;
&amp;gt;&lt;em&gt; &lt;strong&gt;Required&lt;/strong&gt;: &lt;code&gt;No&lt;/code&gt;&lt;br&gt;
&amp;gt;&lt;/em&gt; &lt;strong&gt;User Property&lt;/strong&gt;: &lt;code&gt;analyzer&lt;/code&gt;&lt;br&gt;
&amp;gt;* &lt;strong&gt;Default&lt;/strong&gt;: &lt;code&gt;default&lt;/code&gt;&lt;br&gt;
&amp;gt;-- &lt;a rel=&quot;nofollow&quot; href=&quot;https://maven.apache.org/plugins/maven-dependency-plugin/analyze-mojo.html#analyzer&quot;&gt;dependency:analyze&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;We can create an overall analyzer that reuses the above but adds one specific to Spring Boot.&lt;/p&gt;
&lt;h3 id=&quot;conclusion&quot;&gt;Conclusion&lt;/h3&gt;
&lt;p&gt;The current state of the Maven analyzer doesn't offer any benefit to modern Spring Boot projects. The existing code is open to configuration and even extension. However, we would need to embed a lot of Spring Boot logic. For Quarkus and Micronaut projects, we would require dedicated code as well.&lt;/p&gt;
&lt;p&gt;I don't know if it's worth the time and effort. If you think it is, I hope this blog post can serve as an early-stage analysis.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;To go further:&lt;/strong&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a rel=&quot;nofollow&quot; href=&quot;https://maven.apache.org/plugins/maven-dependency-plugin/analyze-mojo.html&quot;&gt;dependency:analyze&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a rel=&quot;nofollow&quot; href=&quot;https://maven.apache.org/shared/maven-dependency-analyzer/&quot;&gt;Maven Dependency Analyzer&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a rel=&quot;nofollow&quot; href=&quot;https://blog.frankel.ch/designing-your-own-spring-boot-starter/1/&quot;&gt;Designing your own Spring Boot starter – part 1&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a rel=&quot;nofollow&quot; href=&quot;https://blog.frankel.ch/designing-your-own-spring-boot-starter/2/&quot;&gt;Designing your own Spring Boot starter – part 2&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;hr&gt;
&lt;p&gt;&lt;em&gt;Originally published at &lt;a rel=&quot;nofollow&quot; href=&quot;https://blog.frankel.ch/maven-dependency-analyze/&quot;&gt;A Java Geek&lt;/a&gt; on March 9&lt;sup&gt;th&lt;/sup&gt;, 2025&lt;/em&gt;&lt;/p&gt;
</description>
<category>Java</category>
<guid isPermaLink="true">https://coderlegion.com/1430/improving-mavens-dependency-analyze-or-not</guid>
<pubDate>Mon, 10 Mar 2025 15:55:22 +0000</pubDate>
</item>
</channel>
</rss>