How to import external libraries in jshell java 9?

Java 9Jshell

Java 9 Problem Overview


I was trying to understand jshell and fumbled to import external library. As of date I couldn't see any suggestion/solution for this.

Can someone please let me know if already figured this out.

Java 9 Solutions


Solution 1 - Java 9

I tried with 9 Build 162 Linux 64-bit with preparation:

  • Downloaded guava-19.0.jar and commons-lang3-3.4.jar to /opt/libs

The following options are available:

  1. Specify CLASSPATH environment variable:

    $> CLASSPATH="/opt/libs/commons-lang3-3.4.jar:/opt/libs/guava-19.0.jar" bin/jshell

  2. Specify classpath with jshell option:

    $> bin/jshell --class-path /opt/libs/guava-19.0.jar:/opt/libs/commons-lang3-3.4.jar

  3. Configure evaluation context within jshell session with command /env, /reset or /reload(these commands are different, you can check out with its help info), take /env as example:

    jshell> /env -class-path /opt/libs/commons-lang3-3.4.jar:/opt/libs/guava-19.0.jar

And then you're able to either import org.apache.commons.lang3.StringUtils or import com.google.common.base.Optional;.

Solution 2 - Java 9

  • You can load maven artifacts into JShell through this (modified) version of JShell.
  • It also supports /cls command to clear JShell Console. See Maven Example below.

enter image description here

Give a try and share your feedback.

Solution 3 - Java 9

Easier way in maven, see https://stackoverflow.com/questions/47705036/in-jshell-how-to-import-classpath-from-a-maven-project: In your project directory, run:

mvn com.github.johnpoth:jshell-maven-plugin:1.0:run

If you have a maven pom.xml, you can use https://github.com/bitterfox/jshell-maven-plugin. This uses all dependencies as the classpath. The plugin is not currently in maven, so you need to clone the repo: git clone https://github.com/bitterfox/jshell-maven-plugin.git. Then,

  1. mvn clean install

  2. add the following to your pom.xml:

     <build>
     <plugins>
         <plugin>
             <groupId>net.java.openjdk.shinyafox</groupId>
             <artifactId>jshell-maven-plugin</artifactId>
             <version>1.0-SNAPSHOT</version>
         </plugin>
     </plugins>
     </build>
    
  3. start with mvn jshell:compile

Solution 4 - Java 9

Start Jshell importing all jars from a directory

Let directory is ~/app/java/jars/

jshell --class-path $(ls -d ~/app/java/jars/* | tr '\n' ':')

Solution 5 - Java 9

If you are using Fish shell, you can set the alias in your fish config file. Here's how you can do it. In your fish config ( ~/.config/fish/config.fish ), add

alias jshell "~/.jenv/versions/12.0.1/bin/jshell --class-path (find ~/.m2/repository/ -name \"*.jar\" | tr '\n' ':')"

This will load all the jars in your class path.

Note: Change the jshell path and jars repository path accordingly.

Solution 6 - Java 9

If you use script like (find -name "*.jar" | tr '\n' ':') to concat, then you alias will be huge string which I don't like.

If you want to include a directory with all jars, the trick is to use colon (:) first and then the directory name as below -

alias java-shell="~/jdk-10.0.2.jdk/Contents/Home/bin/jshell --class-path :<dir-name>/jars/* "

Otherwise it won't work properly. I wish they should have make it cleaner.

Attributions

All content for this solution is sourced from the original question on Stackoverflow.

The content on this page is licensed under the Attribution-ShareAlike 4.0 International (CC BY-SA 4.0) license.

Content TypeOriginal AuthorOriginal Content on Stackoverflow
QuestionAkshayView Question on Stackoverflow
Solution 1 - Java 9shizhzView Answer on Stackoverflow
Solution 2 - Java 9B. S. RawatView Answer on Stackoverflow
Solution 3 - Java 9serv-incView Answer on Stackoverflow
Solution 4 - Java 9smamranView Answer on Stackoverflow
Solution 5 - Java 9Dinesh ChanderView Answer on Stackoverflow
Solution 6 - Java 9deoView Answer on Stackoverflow