🗂

GitHub Copilot Chat を使って java の環境構築がどこまでできるのかチャレンジ

2023/12/31に公開

ほとんど自分向けの雑メモです。が、誰かの役に立てばと思い公開しています。

GitHub Copilot Chat とは?

GitHub Copilot Labs として元々実験的な GPT の機能を使った IDE 向けの機能がありましたが、それの正式版?としてリリースされたもののようです。間違ってたらごめんなさい。
詳しくはこちらを参照していただけると。
https://docs.github.com/ja/copilot/github-copilot-chat/about-github-copilot-chat

やりたいこと

とある調査のために java のアプリケーションを動かしたかったのですが、そういえば java のプロジェクトを作成したことがなかったことに気づきました。

そこで、調べながらやったら普通にできるだろうと思いつつ、あえて GPT 縛りにしてやってみました。
普通に GitHub Copilot と ChatGPT だけを使うのではなく、GitHub Copilot Labs も使ってみようと思ったところ、GitHub Copilot Chat に変わっていたので、それを使うことにしました。
また、GitHub Copilot Chat のお手並拝見ということで、難易度を上げるためにノリで docker で動くことも要件としてみました。

※ 動くことを目的としているだけななので、どの jdk のディストリビューションやバージョンを使うのかについてはこだわっていません。また、あくまで GitHub Copilot Chat のイメージを知ってもらう目的なので内容の正確性にはそこまでこだわっていません。

プロジェクトの作成

やり始めた当初は ChatGPT でやっていたので、ここだけ ChatGPT です🙏
さて、だいたいのイメージはあるので、大まかな指示を GPT に与えました。

言われた通りに実行してプロジェクトは完成です。

mvn archetype:generate -DgroupId=com.example -DartifactId=my-java-app -DarchetypeArtifactId=maven-archetype-quickstart -DinteractiveMode=false

Dockerfile の作成

続いて Dockerfile を作成していきます。
Chat GPT に言われた通り作成します。

Dockerfile
# ベースイメージを指定
FROM openjdk:11-jre-slim

# アプリケーションJARファイルのコピー
COPY target/my-java-app.jar /app/my-java-app.jar

# アプリケーションの実行
CMD ["java", "-jar", "/app/my-java-app.jar"]

なんかすでに怪しい箇所が多いなと思いつつ、動かしてみたらやはり動かなかったので、ここから GitHub Copilot Chat にガンガンお願いしてみます。
まずは、/fix というものがあったので、使ってみました。選択している部分のコードを修正してくれるようです。

GPT4 なので jdk のバージョンが上がりましたw
ただ、少し前の情報のため少し古いバージョンになっていますね。ここは後から追加修正して 21 に変更しました。
また、プロジェクト構造も理解しているのか、 COPY のパスも正しくなりました。

COPY ./src/main/java/com/example/App.java /app/App.java

ただ明らかに単独の java ファイルしか見にいっておらず動かない予感がぷんぷんしたので先んじて修正をお願いしました。

このように雑な依頼にも関わらず、ファイルまで勝手に参照すべきなのかまで読み取ってくれているのは非常に便利です!(ただしこれは現在開いているファイルのみが参照されているようです。)

動かしてみたところ怒られたので、それを伝えると修正案をくれました。

エラーメッセージ
no main manifest attribute, in /app.jar

さらにすごいことに、勝手に挿入すべき場所を判断して、挿入してくれるオプションもありました。
ただし、現時点では、カーソルがある場所への挿入のみのようです。
機能自体は素晴らしいので今後に期待です!

結果、pom.xml はこのようになりました。

<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
  xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/maven-v4_0_0.xsd">
  <modelVersion>4.0.0</modelVersion>
  <groupId>com.example</groupId>
  <artifactId>my-java-app</artifactId>
  <packaging>jar</packaging>
  <version>1.0-SNAPSHOT</version>
  <name>my-java-app</name>
  <url>http://maven.apache.org</url>
  <dependencies>
    <dependency>
      <groupId>junit</groupId>
      <artifactId>junit</artifactId>
      <version>3.8.1</version>
      <scope>test</scope>
    </dependency>
  </dependencies>
  <build>
    <plugins>
      <plugin>
        <groupId>org.apache.maven.plugins</groupId>
        <artifactId>maven-jar-plugin</artifactId>
        <version>3.2.0</version>
        <configuration>
          <archive>
            <manifest>
              <mainClass>com.example.App</mainClass>
            </manifest>
          </archive>
        </configuration>
      </plugin>
    </plugins>
  </build>
</project>

そして、適当に docker compose を作って起動したところ、、
見事 Hello World の出力に成功しました 🎉
(もちろん docker compose も GPT にお願いしましたが、スクショを撮り忘れてしまいました。。)

どれぐらい使えそうか?

初めて触る言語の初期化には十分使えそうな部分もありつつ、調べた方が早そうなことも多いなと正直思いました。
例えば、pom.xml の一部しか記事に書かれていない場合、どこに挿入したらいいのか分からなくなりましたが、GPT であれば教えてくれるので便利です。(ただし、著作権保護オプションをつけている場合は、ファイル全体の例を聞くと NG になることが多かったです。)
また、いちいちコピペをしなくてもファイルをいい感じに見にいってくれるのも便利でした。

一方でデメリットとしては、当たり前ですが GPT の特性上バージョンが古いことが多く何度もしつこく直されることになってしまいます。
また、ある程度作業の流れややりたいことを知っていることが前提条件になってくるので、プログラミングを何も知らない人がこの手法を使うのはしんどいかもしれません。

現時点ではあくまでサポート的役割で、ChatGPT が VSCode に組み込まれてコンテキスト共有が楽になって使いやすいツールぐらいに思っておくのがよさそうだなと思いました。

Discussion