From 69e04bdf63fab4d75c43d7bf40dbe38aeeda84f5 Mon Sep 17 00:00:00 2001
From: Andy Li <1450947+andy1li@users.noreply.github.com>
Date: Mon, 4 Nov 2024 09:04:27 +0800
Subject: [PATCH] Add Java support
---
.../java/.codecrafters/compile.sh | 11 ++++
compiled_starters/java/.codecrafters/run.sh | 11 ++++
compiled_starters/java/.gitattributes | 1 +
compiled_starters/java/.gitignore | 3 ++
compiled_starters/java/README.md | 50 ++++++++++++++++++
compiled_starters/java/codecrafters.yml | 11 ++++
compiled_starters/java/pom.xml | 52 +++++++++++++++++++
.../java/src/main/java/Main.java | 39 ++++++++++++++
compiled_starters/java/your_program.sh | 24 +++++++++
course-definition.yml | 2 +
dockerfiles/java-23.Dockerfile | 13 +++++
.../java/01-ry8/code/.codecrafters/compile.sh | 11 ++++
.../java/01-ry8/code/.codecrafters/run.sh | 11 ++++
solutions/java/01-ry8/code/.gitattributes | 1 +
solutions/java/01-ry8/code/.gitignore | 3 ++
solutions/java/01-ry8/code/README.md | 50 ++++++++++++++++++
solutions/java/01-ry8/code/codecrafters.yml | 11 ++++
solutions/java/01-ry8/code/pom.xml | 52 +++++++++++++++++++
.../java/01-ry8/code/src/main/java/Main.java | 34 ++++++++++++
solutions/java/01-ry8/code/your_program.sh | 24 +++++++++
.../01-ry8/diff/src/main/java/Main.java.diff | 45 ++++++++++++++++
solutions/java/01-ry8/explanation.md | 21 ++++++++
.../java/code/.codecrafters/compile.sh | 11 ++++
.../java/code/.codecrafters/run.sh | 11 ++++
starter_templates/java/code/.gitignore | 3 ++
starter_templates/java/code/pom.xml | 52 +++++++++++++++++++
.../java/code/src/main/java/Main.java | 39 ++++++++++++++
starter_templates/java/config.yml | 3 ++
28 files changed, 599 insertions(+)
create mode 100755 compiled_starters/java/.codecrafters/compile.sh
create mode 100755 compiled_starters/java/.codecrafters/run.sh
create mode 100644 compiled_starters/java/.gitattributes
create mode 100644 compiled_starters/java/.gitignore
create mode 100644 compiled_starters/java/README.md
create mode 100644 compiled_starters/java/codecrafters.yml
create mode 100644 compiled_starters/java/pom.xml
create mode 100644 compiled_starters/java/src/main/java/Main.java
create mode 100755 compiled_starters/java/your_program.sh
create mode 100644 dockerfiles/java-23.Dockerfile
create mode 100755 solutions/java/01-ry8/code/.codecrafters/compile.sh
create mode 100755 solutions/java/01-ry8/code/.codecrafters/run.sh
create mode 100644 solutions/java/01-ry8/code/.gitattributes
create mode 100644 solutions/java/01-ry8/code/.gitignore
create mode 100644 solutions/java/01-ry8/code/README.md
create mode 100644 solutions/java/01-ry8/code/codecrafters.yml
create mode 100644 solutions/java/01-ry8/code/pom.xml
create mode 100644 solutions/java/01-ry8/code/src/main/java/Main.java
create mode 100755 solutions/java/01-ry8/code/your_program.sh
create mode 100644 solutions/java/01-ry8/diff/src/main/java/Main.java.diff
create mode 100644 solutions/java/01-ry8/explanation.md
create mode 100755 starter_templates/java/code/.codecrafters/compile.sh
create mode 100755 starter_templates/java/code/.codecrafters/run.sh
create mode 100644 starter_templates/java/code/.gitignore
create mode 100644 starter_templates/java/code/pom.xml
create mode 100644 starter_templates/java/code/src/main/java/Main.java
create mode 100644 starter_templates/java/config.yml
diff --git a/compiled_starters/java/.codecrafters/compile.sh b/compiled_starters/java/.codecrafters/compile.sh
new file mode 100755
index 0000000..8d278c3
--- /dev/null
+++ b/compiled_starters/java/.codecrafters/compile.sh
@@ -0,0 +1,11 @@
+#!/bin/sh
+#
+# This script is used to compile your program on CodeCrafters
+#
+# This runs before .codecrafters/run.sh
+#
+# Learn more: https://codecrafters.io/program-interface
+
+set -e # Exit on failure
+
+mvn -B package -Ddir=/tmp/codecrafters-build-interpreter-java
diff --git a/compiled_starters/java/.codecrafters/run.sh b/compiled_starters/java/.codecrafters/run.sh
new file mode 100755
index 0000000..2742ee7
--- /dev/null
+++ b/compiled_starters/java/.codecrafters/run.sh
@@ -0,0 +1,11 @@
+#!/bin/sh
+#
+# This script is used to run your program on CodeCrafters
+#
+# This runs after .codecrafters/compile.sh
+#
+# Learn more: https://codecrafters.io/program-interface
+
+set -e # Exit on failure
+
+exec java -jar /tmp/codecrafters-build-interpreter-java/codecrafters-interpreter.jar "$@"
diff --git a/compiled_starters/java/.gitattributes b/compiled_starters/java/.gitattributes
new file mode 100644
index 0000000..176a458
--- /dev/null
+++ b/compiled_starters/java/.gitattributes
@@ -0,0 +1 @@
+* text=auto
diff --git a/compiled_starters/java/.gitignore b/compiled_starters/java/.gitignore
new file mode 100644
index 0000000..a48b18a
--- /dev/null
+++ b/compiled_starters/java/.gitignore
@@ -0,0 +1,3 @@
+*.jar
+target/
+.idea/
diff --git a/compiled_starters/java/README.md b/compiled_starters/java/README.md
new file mode 100644
index 0000000..37e7aa9
--- /dev/null
+++ b/compiled_starters/java/README.md
@@ -0,0 +1,50 @@
+![progress-banner](https://codecrafters.io/landing/images/default_progress_banners/interpreter.png)
+
+This is a starting point for Java solutions to the
+["Build your own Interpreter" Challenge](https://app.codecrafters.io/courses/interpreter/overview).
+
+This challenge follows the book
+[Crafting Interpreters](https://craftinginterpreters.com/) by Robert Nystrom.
+
+In this challenge you'll build an interpreter for
+[Lox](https://craftinginterpreters.com/the-lox-language.html), a simple
+scripting language. Along the way, you'll learn about tokenization, ASTs,
+tree-walk interpreters and more.
+
+Before starting this challenge, make sure you've read the "Welcome" part of the
+book that contains these chapters:
+
+- [Introduction](https://craftinginterpreters.com/introduction.html) (chapter 1)
+- [A Map of the Territory](https://craftinginterpreters.com/a-map-of-the-territory.html)
+ (chapter 2)
+- [The Lox Language](https://craftinginterpreters.com/the-lox-language.html)
+ (chapter 3)
+
+These chapters don't involve writing code, so they won't be covered in this
+challenge. This challenge will start from chapter 4,
+[Scanning](https://craftinginterpreters.com/scanning.html).
+
+**Note**: If you're viewing this repo on GitHub, head over to
+[codecrafters.io](https://codecrafters.io) to try the challenge.
+
+# Passing the first stage
+
+The entry point for your program is in `src/main/java/Main.java`. Study and
+uncomment the relevant code, and push your changes to pass the first stage:
+
+```sh
+git commit -am "pass 1st stage" # any msg
+git push origin master
+```
+
+Time to move on to the next stage!
+
+# Stage 2 & beyond
+
+Note: This section is for stages 2 and beyond.
+
+1. Ensure you have `mvn` installed locally
+2. Run `./your_program.sh` to run your program, which is implemented in
+ `src/main/java/Main.java`.
+3. Commit your changes and run `git push origin master` to submit your solution
+ to CodeCrafters. Test output will be streamed to your terminal.
diff --git a/compiled_starters/java/codecrafters.yml b/compiled_starters/java/codecrafters.yml
new file mode 100644
index 0000000..2406954
--- /dev/null
+++ b/compiled_starters/java/codecrafters.yml
@@ -0,0 +1,11 @@
+# Set this to true if you want debug logs.
+#
+# These can be VERY verbose, so we suggest turning them off
+# unless you really need them.
+debug: false
+
+# Use this to change the Java version used to run your code
+# on Codecrafters.
+#
+# Available versions: java-23
+language_pack: java-23
diff --git a/compiled_starters/java/pom.xml b/compiled_starters/java/pom.xml
new file mode 100644
index 0000000..3df943b
--- /dev/null
+++ b/compiled_starters/java/pom.xml
@@ -0,0 +1,52 @@
+
+
+ 4.0.0
+
+ io.codecrafters
+ codecrafters-interpreter
+ 1.0
+
+
+ 23
+ 23
+ UTF-8
+ 23
+
+
+
+
+
+ org.apache.maven.plugins
+ maven-assembly-plugin
+
+ codecrafters-interpreter
+
+ jar-with-dependencies
+
+ false
+
+
+ true
+
+ Main
+
+
+ ${dir}
+
+
+
+
+ make-assembly
+ package
+
+ single
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/compiled_starters/java/src/main/java/Main.java b/compiled_starters/java/src/main/java/Main.java
new file mode 100644
index 0000000..5de5794
--- /dev/null
+++ b/compiled_starters/java/src/main/java/Main.java
@@ -0,0 +1,39 @@
+import java.io.IOException;
+import java.nio.file.Files;
+import java.nio.file.Path;
+
+public class Main {
+ public static void main(String[] args) {
+ // You can use print statements as follows for debugging, they'll be visible when running tests.
+ System.err.println("Logs from your program will appear here!");
+
+ if (args.length < 2) {
+ System.err.println("Usage: ./your_program.sh tokenize ");
+ System.exit(1);
+ }
+
+ String command = args[0];
+ String filename = args[1];
+
+ if (!command.equals("tokenize")) {
+ System.err.println("Unknown command: " + command);
+ System.exit(1);
+ }
+
+ String fileContents = "";
+ try {
+ fileContents = Files.readString(Path.of(filename));
+ } catch (IOException e) {
+ System.err.println("Error reading file: " + e.getMessage());
+ System.exit(1);
+ }
+
+ // Uncomment this block to pass the first stage
+ //
+ // if (fileContents.length() > 0) {
+ // throw new RuntimeException("Scanner not implemented");
+ // } else {
+ // System.out.println("EOF null"); // Placeholder, remove this line when implementing the scanner
+ // }
+ }
+}
diff --git a/compiled_starters/java/your_program.sh b/compiled_starters/java/your_program.sh
new file mode 100755
index 0000000..84ad0ca
--- /dev/null
+++ b/compiled_starters/java/your_program.sh
@@ -0,0 +1,24 @@
+#!/bin/sh
+#
+# Use this script to run your program LOCALLY.
+#
+# Note: Changing this script WILL NOT affect how CodeCrafters runs your program.
+#
+# Learn more: https://codecrafters.io/program-interface
+
+set -e # Exit early if any commands fail
+
+# Copied from .codecrafters/compile.sh
+#
+# - Edit this to change how your program compiles locally
+# - Edit .codecrafters/compile.sh to change how your program compiles remotely
+(
+ cd "$(dirname "$0")" # Ensure compile steps are run within the repository directory
+ mvn -B package -Ddir=/tmp/codecrafters-build-interpreter-java
+)
+
+# Copied from .codecrafters/run.sh
+#
+# - Edit this to change how your program runs locally
+# - Edit .codecrafters/run.sh to change how your program runs remotely
+exec java -jar /tmp/codecrafters-build-interpreter-java/codecrafters-interpreter.jar "$@"
diff --git a/course-definition.yml b/course-definition.yml
index 572f5f0..496899b 100644
--- a/course-definition.yml
+++ b/course-definition.yml
@@ -27,6 +27,8 @@ languages:
- slug: "c"
- slug: "gleam"
- slug: "go"
+ - slug: "java"
+ release_status: "alpha"
- slug: "kotlin"
- slug: "ocaml"
- slug: "python"
diff --git a/dockerfiles/java-23.Dockerfile b/dockerfiles/java-23.Dockerfile
new file mode 100644
index 0000000..6199494
--- /dev/null
+++ b/dockerfiles/java-23.Dockerfile
@@ -0,0 +1,13 @@
+# syntax=docker/dockerfile:1.7-labs
+FROM maven:3.9.9-eclipse-temurin-23-alpine
+
+# Ensures the container is re-built if dependency files change
+ENV CODECRAFTERS_DEPENDENCY_FILE_PATHS="pom.xml"
+
+WORKDIR /app
+
+# .git & README.md are unique per-repository. We ignore them on first copy to prevent cache misses
+COPY --exclude=.git --exclude=README.md . /app
+
+# Install language-specific dependencies
+RUN .codecrafters/compile.sh
diff --git a/solutions/java/01-ry8/code/.codecrafters/compile.sh b/solutions/java/01-ry8/code/.codecrafters/compile.sh
new file mode 100755
index 0000000..8d278c3
--- /dev/null
+++ b/solutions/java/01-ry8/code/.codecrafters/compile.sh
@@ -0,0 +1,11 @@
+#!/bin/sh
+#
+# This script is used to compile your program on CodeCrafters
+#
+# This runs before .codecrafters/run.sh
+#
+# Learn more: https://codecrafters.io/program-interface
+
+set -e # Exit on failure
+
+mvn -B package -Ddir=/tmp/codecrafters-build-interpreter-java
diff --git a/solutions/java/01-ry8/code/.codecrafters/run.sh b/solutions/java/01-ry8/code/.codecrafters/run.sh
new file mode 100755
index 0000000..2742ee7
--- /dev/null
+++ b/solutions/java/01-ry8/code/.codecrafters/run.sh
@@ -0,0 +1,11 @@
+#!/bin/sh
+#
+# This script is used to run your program on CodeCrafters
+#
+# This runs after .codecrafters/compile.sh
+#
+# Learn more: https://codecrafters.io/program-interface
+
+set -e # Exit on failure
+
+exec java -jar /tmp/codecrafters-build-interpreter-java/codecrafters-interpreter.jar "$@"
diff --git a/solutions/java/01-ry8/code/.gitattributes b/solutions/java/01-ry8/code/.gitattributes
new file mode 100644
index 0000000..176a458
--- /dev/null
+++ b/solutions/java/01-ry8/code/.gitattributes
@@ -0,0 +1 @@
+* text=auto
diff --git a/solutions/java/01-ry8/code/.gitignore b/solutions/java/01-ry8/code/.gitignore
new file mode 100644
index 0000000..a48b18a
--- /dev/null
+++ b/solutions/java/01-ry8/code/.gitignore
@@ -0,0 +1,3 @@
+*.jar
+target/
+.idea/
diff --git a/solutions/java/01-ry8/code/README.md b/solutions/java/01-ry8/code/README.md
new file mode 100644
index 0000000..37e7aa9
--- /dev/null
+++ b/solutions/java/01-ry8/code/README.md
@@ -0,0 +1,50 @@
+![progress-banner](https://codecrafters.io/landing/images/default_progress_banners/interpreter.png)
+
+This is a starting point for Java solutions to the
+["Build your own Interpreter" Challenge](https://app.codecrafters.io/courses/interpreter/overview).
+
+This challenge follows the book
+[Crafting Interpreters](https://craftinginterpreters.com/) by Robert Nystrom.
+
+In this challenge you'll build an interpreter for
+[Lox](https://craftinginterpreters.com/the-lox-language.html), a simple
+scripting language. Along the way, you'll learn about tokenization, ASTs,
+tree-walk interpreters and more.
+
+Before starting this challenge, make sure you've read the "Welcome" part of the
+book that contains these chapters:
+
+- [Introduction](https://craftinginterpreters.com/introduction.html) (chapter 1)
+- [A Map of the Territory](https://craftinginterpreters.com/a-map-of-the-territory.html)
+ (chapter 2)
+- [The Lox Language](https://craftinginterpreters.com/the-lox-language.html)
+ (chapter 3)
+
+These chapters don't involve writing code, so they won't be covered in this
+challenge. This challenge will start from chapter 4,
+[Scanning](https://craftinginterpreters.com/scanning.html).
+
+**Note**: If you're viewing this repo on GitHub, head over to
+[codecrafters.io](https://codecrafters.io) to try the challenge.
+
+# Passing the first stage
+
+The entry point for your program is in `src/main/java/Main.java`. Study and
+uncomment the relevant code, and push your changes to pass the first stage:
+
+```sh
+git commit -am "pass 1st stage" # any msg
+git push origin master
+```
+
+Time to move on to the next stage!
+
+# Stage 2 & beyond
+
+Note: This section is for stages 2 and beyond.
+
+1. Ensure you have `mvn` installed locally
+2. Run `./your_program.sh` to run your program, which is implemented in
+ `src/main/java/Main.java`.
+3. Commit your changes and run `git push origin master` to submit your solution
+ to CodeCrafters. Test output will be streamed to your terminal.
diff --git a/solutions/java/01-ry8/code/codecrafters.yml b/solutions/java/01-ry8/code/codecrafters.yml
new file mode 100644
index 0000000..2406954
--- /dev/null
+++ b/solutions/java/01-ry8/code/codecrafters.yml
@@ -0,0 +1,11 @@
+# Set this to true if you want debug logs.
+#
+# These can be VERY verbose, so we suggest turning them off
+# unless you really need them.
+debug: false
+
+# Use this to change the Java version used to run your code
+# on Codecrafters.
+#
+# Available versions: java-23
+language_pack: java-23
diff --git a/solutions/java/01-ry8/code/pom.xml b/solutions/java/01-ry8/code/pom.xml
new file mode 100644
index 0000000..3df943b
--- /dev/null
+++ b/solutions/java/01-ry8/code/pom.xml
@@ -0,0 +1,52 @@
+
+
+ 4.0.0
+
+ io.codecrafters
+ codecrafters-interpreter
+ 1.0
+
+
+ 23
+ 23
+ UTF-8
+ 23
+
+
+
+
+
+ org.apache.maven.plugins
+ maven-assembly-plugin
+
+ codecrafters-interpreter
+
+ jar-with-dependencies
+
+ false
+
+
+ true
+
+ Main
+
+
+ ${dir}
+
+
+
+
+ make-assembly
+ package
+
+ single
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/solutions/java/01-ry8/code/src/main/java/Main.java b/solutions/java/01-ry8/code/src/main/java/Main.java
new file mode 100644
index 0000000..e02875a
--- /dev/null
+++ b/solutions/java/01-ry8/code/src/main/java/Main.java
@@ -0,0 +1,34 @@
+import java.io.IOException;
+import java.nio.file.Files;
+import java.nio.file.Path;
+
+public class Main {
+ public static void main(String[] args) {
+ if (args.length < 2) {
+ System.err.println("Usage: ./your_program.sh tokenize ");
+ System.exit(1);
+ }
+
+ String command = args[0];
+ String filename = args[1];
+
+ if (!command.equals("tokenize")) {
+ System.err.println("Unknown command: " + command);
+ System.exit(1);
+ }
+
+ String fileContents = "";
+ try {
+ fileContents = Files.readString(Path.of(filename));
+ } catch (IOException e) {
+ System.err.println("Error reading file: " + e.getMessage());
+ System.exit(1);
+ }
+
+ if (fileContents.length() > 0) {
+ throw new RuntimeException("Scanner not implemented");
+ } else {
+ System.out.println("EOF null"); // Placeholder, remove this line when implementing the scanner
+ }
+ }
+}
diff --git a/solutions/java/01-ry8/code/your_program.sh b/solutions/java/01-ry8/code/your_program.sh
new file mode 100755
index 0000000..84ad0ca
--- /dev/null
+++ b/solutions/java/01-ry8/code/your_program.sh
@@ -0,0 +1,24 @@
+#!/bin/sh
+#
+# Use this script to run your program LOCALLY.
+#
+# Note: Changing this script WILL NOT affect how CodeCrafters runs your program.
+#
+# Learn more: https://codecrafters.io/program-interface
+
+set -e # Exit early if any commands fail
+
+# Copied from .codecrafters/compile.sh
+#
+# - Edit this to change how your program compiles locally
+# - Edit .codecrafters/compile.sh to change how your program compiles remotely
+(
+ cd "$(dirname "$0")" # Ensure compile steps are run within the repository directory
+ mvn -B package -Ddir=/tmp/codecrafters-build-interpreter-java
+)
+
+# Copied from .codecrafters/run.sh
+#
+# - Edit this to change how your program runs locally
+# - Edit .codecrafters/run.sh to change how your program runs remotely
+exec java -jar /tmp/codecrafters-build-interpreter-java/codecrafters-interpreter.jar "$@"
diff --git a/solutions/java/01-ry8/diff/src/main/java/Main.java.diff b/solutions/java/01-ry8/diff/src/main/java/Main.java.diff
new file mode 100644
index 0000000..a92349b
--- /dev/null
+++ b/solutions/java/01-ry8/diff/src/main/java/Main.java.diff
@@ -0,0 +1,45 @@
+@@ -1,39 +1,34 @@
+ import java.io.IOException;
+ import java.nio.file.Files;
+ import java.nio.file.Path;
+
+ public class Main {
+ public static void main(String[] args) {
+- // You can use print statements as follows for debugging, they'll be visible when running tests.
+- System.err.println("Logs from your program will appear here!");
+-
+ if (args.length < 2) {
+ System.err.println("Usage: ./your_program.sh tokenize ");
+ System.exit(1);
+ }
+
+ String command = args[0];
+ String filename = args[1];
+
+ if (!command.equals("tokenize")) {
+ System.err.println("Unknown command: " + command);
+ System.exit(1);
+ }
+
+ String fileContents = "";
+ try {
+ fileContents = Files.readString(Path.of(filename));
+ } catch (IOException e) {
+ System.err.println("Error reading file: " + e.getMessage());
+ System.exit(1);
+ }
+
+- // Uncomment this block to pass the first stage
+- //
+- // if (fileContents.length() > 0) {
+- // throw new RuntimeException("Scanner not implemented");
+- // } else {
+- // System.out.println("EOF null"); // Placeholder, remove this line when implementing the scanner
+- // }
++ if (fileContents.length() > 0) {
++ throw new RuntimeException("Scanner not implemented");
++ } else {
++ System.out.println("EOF null"); // Placeholder, remove this line when implementing the scanner
++ }
+ }
+ }
diff --git a/solutions/java/01-ry8/explanation.md b/solutions/java/01-ry8/explanation.md
new file mode 100644
index 0000000..87bf11d
--- /dev/null
+++ b/solutions/java/01-ry8/explanation.md
@@ -0,0 +1,21 @@
+The entry point for your Interpreter implementation is in `src/main/java/Main.java`.
+
+Study and uncomment the relevant code:
+
+```java
+// Uncomment this block to pass the first stage
+
+if (fileContents.length() > 0) {
+ throw new RuntimeException("Scanner not implemented");
+} else {
+ System.out.println("EOF null"); // Placeholder, remove this line when implementing the scanner
+}
+```
+
+Push your changes to pass the first stage:
+
+```
+git add .
+git commit -m "pass 1st stage" # any msg
+git push origin master
+```
diff --git a/starter_templates/java/code/.codecrafters/compile.sh b/starter_templates/java/code/.codecrafters/compile.sh
new file mode 100755
index 0000000..8d278c3
--- /dev/null
+++ b/starter_templates/java/code/.codecrafters/compile.sh
@@ -0,0 +1,11 @@
+#!/bin/sh
+#
+# This script is used to compile your program on CodeCrafters
+#
+# This runs before .codecrafters/run.sh
+#
+# Learn more: https://codecrafters.io/program-interface
+
+set -e # Exit on failure
+
+mvn -B package -Ddir=/tmp/codecrafters-build-interpreter-java
diff --git a/starter_templates/java/code/.codecrafters/run.sh b/starter_templates/java/code/.codecrafters/run.sh
new file mode 100755
index 0000000..2742ee7
--- /dev/null
+++ b/starter_templates/java/code/.codecrafters/run.sh
@@ -0,0 +1,11 @@
+#!/bin/sh
+#
+# This script is used to run your program on CodeCrafters
+#
+# This runs after .codecrafters/compile.sh
+#
+# Learn more: https://codecrafters.io/program-interface
+
+set -e # Exit on failure
+
+exec java -jar /tmp/codecrafters-build-interpreter-java/codecrafters-interpreter.jar "$@"
diff --git a/starter_templates/java/code/.gitignore b/starter_templates/java/code/.gitignore
new file mode 100644
index 0000000..a48b18a
--- /dev/null
+++ b/starter_templates/java/code/.gitignore
@@ -0,0 +1,3 @@
+*.jar
+target/
+.idea/
diff --git a/starter_templates/java/code/pom.xml b/starter_templates/java/code/pom.xml
new file mode 100644
index 0000000..3df943b
--- /dev/null
+++ b/starter_templates/java/code/pom.xml
@@ -0,0 +1,52 @@
+
+
+ 4.0.0
+
+ io.codecrafters
+ codecrafters-interpreter
+ 1.0
+
+
+ 23
+ 23
+ UTF-8
+ 23
+
+
+
+
+
+ org.apache.maven.plugins
+ maven-assembly-plugin
+
+ codecrafters-interpreter
+
+ jar-with-dependencies
+
+ false
+
+
+ true
+
+ Main
+
+
+ ${dir}
+
+
+
+
+ make-assembly
+ package
+
+ single
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/starter_templates/java/code/src/main/java/Main.java b/starter_templates/java/code/src/main/java/Main.java
new file mode 100644
index 0000000..5de5794
--- /dev/null
+++ b/starter_templates/java/code/src/main/java/Main.java
@@ -0,0 +1,39 @@
+import java.io.IOException;
+import java.nio.file.Files;
+import java.nio.file.Path;
+
+public class Main {
+ public static void main(String[] args) {
+ // You can use print statements as follows for debugging, they'll be visible when running tests.
+ System.err.println("Logs from your program will appear here!");
+
+ if (args.length < 2) {
+ System.err.println("Usage: ./your_program.sh tokenize ");
+ System.exit(1);
+ }
+
+ String command = args[0];
+ String filename = args[1];
+
+ if (!command.equals("tokenize")) {
+ System.err.println("Unknown command: " + command);
+ System.exit(1);
+ }
+
+ String fileContents = "";
+ try {
+ fileContents = Files.readString(Path.of(filename));
+ } catch (IOException e) {
+ System.err.println("Error reading file: " + e.getMessage());
+ System.exit(1);
+ }
+
+ // Uncomment this block to pass the first stage
+ //
+ // if (fileContents.length() > 0) {
+ // throw new RuntimeException("Scanner not implemented");
+ // } else {
+ // System.out.println("EOF null"); // Placeholder, remove this line when implementing the scanner
+ // }
+ }
+}
diff --git a/starter_templates/java/config.yml b/starter_templates/java/config.yml
new file mode 100644
index 0000000..c35aa0d
--- /dev/null
+++ b/starter_templates/java/config.yml
@@ -0,0 +1,3 @@
+attributes:
+ required_executable: mvn
+ user_editable_file: src/main/java/Main.java