<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom" xmlns:dc="http://purl.org/dc/elements/1.1/">
  <channel>
    <title>DEV Community: kawasima</title>
    <description>The latest articles on DEV Community by kawasima (@kawasima).</description>
    <link>https://dev.to/kawasima</link>
    <image>
      <url>https://media2.dev.to/dynamic/image/width=90,height=90,fit=cover,gravity=auto,format=auto/https:%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Fuser%2Fprofile_image%2F3819898%2F5dcdae63-040f-4714-aa7a-5c098b326b6a.png</url>
      <title>DEV Community: kawasima</title>
      <link>https://dev.to/kawasima</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/kawasima"/>
    <language>en</language>
    <item>
      <title>Stop Creating Throwaway Maven Projects Just to Try a Java Library</title>
      <dc:creator>kawasima</dc:creator>
      <pubDate>Thu, 12 Mar 2026 09:17:39 +0000</pubDate>
      <link>https://dev.to/kawasima/stop-creating-throwaway-maven-projects-just-to-try-a-java-library-1dc8</link>
      <guid>https://dev.to/kawasima/stop-creating-throwaway-maven-projects-just-to-try-a-java-library-1dc8</guid>
      <description>&lt;p&gt;Every Java developer knows this workflow.&lt;/p&gt;

&lt;p&gt;You find a library you want to try.&lt;/p&gt;

&lt;p&gt;Then you have to:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;create a project&lt;/li&gt;
&lt;li&gt;write a pom.xml&lt;/li&gt;
&lt;li&gt;wait for your IDE to index dependencies&lt;/li&gt;
&lt;li&gt;write a tiny test&lt;/li&gt;
&lt;li&gt;throw the whole thing away later&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;All of that, just to call two methods and throw the project away.&lt;/p&gt;

&lt;p&gt;I built JetShell — an interactive Java shell for exploring libraries instantly. Type a single &lt;code&gt;/resolve&lt;/code&gt; command, and JetShell pulls the artifact along with all its transitive dependencies onto the classpath. No pom.xml. No dependency hell. Just import the class and start calling methods.&lt;/p&gt;

&lt;p&gt;GitHub: &lt;a href="https://github.com/kawasima/jetshell" rel="noopener noreferrer"&gt;https://github.com/kawasima/jetshell&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  What JetShell is really for
&lt;/h2&gt;

&lt;p&gt;JetShell is not just "JShell, but smaller."&lt;/p&gt;

&lt;p&gt;Its real job is to remove the friction of library exploration.&lt;/p&gt;

&lt;p&gt;With JetShell, you can:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;resolve a Maven artifact and all its transitive dependencies into your session with a single &lt;code&gt;/resolve&lt;/code&gt; command&lt;/li&gt;
&lt;li&gt;use Tab completion for group IDs, artifact IDs, and versions&lt;/li&gt;
&lt;li&gt;inspect the full dependency tree with &lt;code&gt;/deps&lt;/code&gt;
&lt;/li&gt;
&lt;li&gt;read Javadoc from the shell with &lt;code&gt;/doc&lt;/code&gt;
&lt;/li&gt;
&lt;li&gt;open source code with &lt;code&gt;/source&lt;/code&gt;
&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;The workflow becomes:&lt;/p&gt;

&lt;p&gt;find library → &lt;code&gt;/resolve&lt;/code&gt; → import class → try API → read docs/source&lt;/p&gt;

&lt;p&gt;No temporary project. No IDE indexing pause. No context switch.&lt;/p&gt;

&lt;h2&gt;
  
  
  A quick example
&lt;/h2&gt;

&lt;p&gt;Here is the kind of thing I wanted to make easy:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight java"&gt;&lt;code&gt;&lt;span class="o"&gt;-&amp;gt;&lt;/span&gt; &lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="n"&gt;resolve&lt;/span&gt; &lt;span class="n"&gt;org&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;apache&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;commons&lt;/span&gt;&lt;span class="o"&gt;:&lt;/span&gt;&lt;span class="n"&gt;commons&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="nl"&gt;lang3:&lt;/span&gt;&lt;span class="mf"&gt;3.14&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="mi"&gt;0&lt;/span&gt;
&lt;span class="o"&gt;|&lt;/span&gt;  &lt;span class="nc"&gt;Path&lt;/span&gt; &lt;span class="o"&gt;.../&lt;/span&gt;&lt;span class="n"&gt;commons&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="n"&gt;lang3&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="mf"&gt;3.14&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;jar&lt;/span&gt; &lt;span class="n"&gt;added&lt;/span&gt; &lt;span class="n"&gt;to&lt;/span&gt; &lt;span class="n"&gt;classpath&lt;/span&gt;

&lt;span class="o"&gt;-&amp;gt;&lt;/span&gt; &lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="nn"&gt;org.apache.commons.lang3.StringUtils&lt;/span&gt;&lt;span class="o"&gt;;&lt;/span&gt;
&lt;span class="o"&gt;-&amp;gt;&lt;/span&gt; &lt;span class="nc"&gt;StringUtils&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;capitalize&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="s"&gt;"hello world"&lt;/span&gt;&lt;span class="o"&gt;)&lt;/span&gt;
&lt;span class="o"&gt;|&lt;/span&gt;  &lt;span class="nc"&gt;Expression&lt;/span&gt; &lt;span class="n"&gt;value&lt;/span&gt; &lt;span class="nl"&gt;is:&lt;/span&gt; &lt;span class="s"&gt;"Hello world"&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;code&gt;commons-lang3&lt;/code&gt; has no transitive dependencies, so the benefit is subtle here. Try something heavier:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight java"&gt;&lt;code&gt;&lt;span class="o"&gt;-&amp;gt;&lt;/span&gt; &lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="n"&gt;resolve&lt;/span&gt; &lt;span class="n"&gt;org&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;apache&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;httpcomponents&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;client5&lt;/span&gt;&lt;span class="o"&gt;:&lt;/span&gt;&lt;span class="nl"&gt;httpclient5:&lt;/span&gt;&lt;span class="mf"&gt;5.4&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="mi"&gt;3&lt;/span&gt;
&lt;span class="o"&gt;|&lt;/span&gt;  &lt;span class="nc"&gt;Path&lt;/span&gt; &lt;span class="o"&gt;.../&lt;/span&gt;&lt;span class="n"&gt;httpclient5&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="mf"&gt;5.4&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="mi"&gt;3&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;jar&lt;/span&gt; &lt;span class="n"&gt;added&lt;/span&gt; &lt;span class="n"&gt;to&lt;/span&gt; &lt;span class="n"&gt;classpath&lt;/span&gt;
&lt;span class="o"&gt;|&lt;/span&gt;  &lt;span class="nc"&gt;Path&lt;/span&gt; &lt;span class="o"&gt;.../&lt;/span&gt;&lt;span class="n"&gt;httpcore5&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="mf"&gt;5.3&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="mi"&gt;3&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;jar&lt;/span&gt; &lt;span class="n"&gt;added&lt;/span&gt; &lt;span class="n"&gt;to&lt;/span&gt; &lt;span class="n"&gt;classpath&lt;/span&gt;
&lt;span class="o"&gt;|&lt;/span&gt;  &lt;span class="nc"&gt;Path&lt;/span&gt; &lt;span class="o"&gt;.../&lt;/span&gt;&lt;span class="n"&gt;httpcore5&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="n"&gt;h2&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="mf"&gt;5.3&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="mi"&gt;3&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;jar&lt;/span&gt; &lt;span class="n"&gt;added&lt;/span&gt; &lt;span class="n"&gt;to&lt;/span&gt; &lt;span class="n"&gt;classpath&lt;/span&gt;
&lt;span class="o"&gt;|&lt;/span&gt;  &lt;span class="nc"&gt;Path&lt;/span&gt; &lt;span class="o"&gt;.../&lt;/span&gt;&lt;span class="n"&gt;slf4j&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="n"&gt;api&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="mf"&gt;1.7&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="mi"&gt;36&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;jar&lt;/span&gt; &lt;span class="n"&gt;added&lt;/span&gt; &lt;span class="n"&gt;to&lt;/span&gt; &lt;span class="n"&gt;classpath&lt;/span&gt;

&lt;span class="o"&gt;-&amp;gt;&lt;/span&gt; &lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="nn"&gt;org.apache.hc.client5.http.classic.methods.HttpGet&lt;/span&gt;&lt;span class="o"&gt;;&lt;/span&gt;
&lt;span class="o"&gt;-&amp;gt;&lt;/span&gt; &lt;span class="kt"&gt;var&lt;/span&gt; &lt;span class="n"&gt;req&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="k"&gt;new&lt;/span&gt; &lt;span class="nc"&gt;HttpGet&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="s"&gt;"https://example.com"&lt;/span&gt;&lt;span class="o"&gt;);&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;One command resolved &lt;code&gt;httpclient5&lt;/code&gt; and its four transitive dependencies. No need to hunt down each JAR or write a dependency block — JetShell walks the POM graph for you.&lt;/p&gt;

&lt;p&gt;Documentation is one keystroke away:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight java"&gt;&lt;code&gt;&lt;span class="o"&gt;-&amp;gt;&lt;/span&gt; &lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="n"&gt;doc&lt;/span&gt; &lt;span class="nc"&gt;StringUtils&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;isEmpty&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;
&lt;span class="o"&gt;|&lt;/span&gt;  &lt;span class="kt"&gt;boolean&lt;/span&gt; &lt;span class="nc"&gt;StringUtils&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;isEmpty&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="nc"&gt;CharSequence&lt;/span&gt; &lt;span class="n"&gt;cs&lt;/span&gt;&lt;span class="o"&gt;)&lt;/span&gt;
&lt;span class="o"&gt;|&lt;/span&gt;  &lt;span class="nc"&gt;Checks&lt;/span&gt; &lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="n"&gt;a&lt;/span&gt; &lt;span class="nc"&gt;CharSequence&lt;/span&gt; &lt;span class="n"&gt;is&lt;/span&gt; &lt;span class="nf"&gt;empty&lt;/span&gt; &lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="s"&gt;""&lt;/span&gt;&lt;span class="o"&gt;)&lt;/span&gt; &lt;span class="n"&gt;or&lt;/span&gt; &lt;span class="kc"&gt;null&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt; &lt;span class="o"&gt;...&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;So is the source:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight java"&gt;&lt;code&gt;&lt;span class="o"&gt;-&amp;gt;&lt;/span&gt; &lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="n"&gt;source&lt;/span&gt; &lt;span class="n"&gt;org&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;apache&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;commons&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;lang3&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;StringUtils&lt;/span&gt;
&lt;span class="o"&gt;|&lt;/span&gt;   &lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="o"&gt;:&lt;/span&gt; &lt;span class="o"&gt;/*&lt;/span&gt;
&lt;span class="o"&gt;|&lt;/span&gt;   &lt;span class="mi"&gt;2&lt;/span&gt;&lt;span class="o"&gt;:&lt;/span&gt;  &lt;span class="o"&gt;*&lt;/span&gt; &lt;span class="nc"&gt;Licensed&lt;/span&gt; &lt;span class="n"&gt;to&lt;/span&gt; &lt;span class="n"&gt;the&lt;/span&gt; &lt;span class="nc"&gt;Apache&lt;/span&gt; &lt;span class="nc"&gt;Software&lt;/span&gt; &lt;span class="nf"&gt;Foundation&lt;/span&gt; &lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="no"&gt;ASF&lt;/span&gt;&lt;span class="o"&gt;)&lt;/span&gt; &lt;span class="o"&gt;...&lt;/span&gt;
&lt;span class="o"&gt;...&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;JetShell downloads source JARs automatically when needed for third-party libraries.&lt;/p&gt;

&lt;h2&gt;
  
  
  Why I built it
&lt;/h2&gt;

&lt;p&gt;Java has excellent libraries.&lt;/p&gt;

&lt;p&gt;What it often lacks is a low-friction way to poke at them.&lt;/p&gt;

&lt;p&gt;In practice, exploring an unfamiliar library usually means paying the full "project setup tax" before you even know whether the API is what you want. That tax includes not just the pom.xml boilerplate, but manually figuring out which transitive dependencies you need — or waiting for Maven/Gradle to download the internet while your IDE re-indexes.&lt;/p&gt;

&lt;p&gt;JetShell exists to make that first contact cheap: one &lt;code&gt;/resolve&lt;/code&gt; command replaces the entire setup ceremony.&lt;/p&gt;

&lt;h2&gt;
  
  
  The part I like most: artifact completion
&lt;/h2&gt;

&lt;p&gt;One feature that changes the feel of the tool is Tab completion for artifact coordinates.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;-&amp;gt; /resolve org.apache.commons:&amp;lt;Tab&amp;gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;JetShell suggests matching artifacts. Then:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;-&amp;gt; /resolve org.apache.commons:commons-lang3:&amp;lt;Tab&amp;gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;It suggests versions.&lt;/p&gt;

&lt;p&gt;It searches both your local &lt;code&gt;~/.m2/repository&lt;/code&gt; and Maven Central. Local results appear immediately; Maven Central results follow after a brief search. Dependency discovery becomes interactive instead of bureaucratic.&lt;/p&gt;

&lt;h2&gt;
  
  
  Installation
&lt;/h2&gt;

&lt;p&gt;JetShell requires Java 21+. The release is distributed as a self-contained executable JAR:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;curl &lt;span class="nt"&gt;-OL&lt;/span&gt; https://github.com/kawasima/jetshell/releases/download/v1.0.1/jetshell
&lt;span class="nb"&gt;chmod&lt;/span&gt; +x jetshell
./jetshell
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;You can also build from source with Maven.&lt;/p&gt;

&lt;h2&gt;
  
  
  What JetShell is good for
&lt;/h2&gt;

&lt;p&gt;JetShell is especially useful for:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;exploring unfamiliar Maven libraries — with all transitive dependencies resolved automatically&lt;/li&gt;
&lt;li&gt;trying API calls before committing a dependency to a real project&lt;/li&gt;
&lt;li&gt;reading Javadoc and source without leaving the shell&lt;/li&gt;
&lt;li&gt;checking dependency trees quickly with &lt;code&gt;/deps&lt;/code&gt;
&lt;/li&gt;
&lt;li&gt;learning Java libraries by interacting with them instead of just reading docs&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;The REPL is just the medium. The point is cutting the gap between "I wonder if this library does X" and actually knowing.&lt;/p&gt;

&lt;h2&gt;
  
  
  If this sounds useful, try it
&lt;/h2&gt;

&lt;p&gt;Repository: &lt;a href="https://github.com/kawasima/jetshell" rel="noopener noreferrer"&gt;https://github.com/kawasima/jetshell&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;If you have ever created a temporary Maven project just to test one class, JetShell was built for exactly that frustration.&lt;/p&gt;

</description>
      <category>java</category>
    </item>
  </channel>
</rss>
