Java setting



1. 자바 프로젝트 뼈대 생성


1. mkdir example && cd example
2. mkdir -p src/main/java
3. mkdir -p src/test/java
4. mkdir -p src/main/resources
5. mkdir -p target/classes
6. mkdir lib



tree 명령어로 프로젝트 구조를 조회할 수 있다.



2. 소스 코드 작성


1. cd src/main/java
2. mkdir -p com/example/app && cd com/example/app
3. vi App.java
package com.example.app;

public class App {
  public static void main(String[] args) {
    System.out.println("Hello World");
  } 
}



3. 컴파일


javac src/main/java/com/example/app/App.java -d target/classes/com/example/app/
.
├── lib
├── src
│   ├── main
│   │   ├── java
│   │   │   └── com
│   │   │       └── example
│   │   │           └── app
│   │   │               └── App.java
│   │   └── resources
│   └── test
│       └── java
└── target
    └── classes
        └── com
            └── example
                └── app
                    └── App.class



4. 실행


java -cp target/classes com.example.app.App



5. Import Class 작성


1. mkdir src/main/java/com/example/app/service && cd src/main/java/com/example/app/service
2. vi Service.java
package com.example.app.service;

public class Service {
    public double compute(double a, double b) {
        return a + b;
    }
}



6. 컴파일


javac -d ./target/classes ./src/main/java/com/example/app/service/Service.java
.
├── lib
├── src
│   ├── main
│   │   ├── java
│   │   │   └── com
│   │   │       └── example
│   │   │           └── app
│   │   │               ├── App.java
│   │   │               └── service
│   │   │                   └── Service.java
│   │   └── resources
│   └── test
│       └── java
└── target
    └── classes
        └── com
            └── example
                └── app
                    ├── App.class
                    └── service
                        └── Service.class

CLASSPATH 등록

export CLASSPATH="[project 경로]/target/classes:$CLASSPATH"



7. App 에 Import


package com.example.app;

import com.example.app.service.Service;

public class App {
  public static void main(String[] args) {
    if(args.length != 2) {
        System.out.println("두 개의 인수를 주세요!");
        System.exit(0);
      }
      Service service = new Service();
      double a = Double.parseDouble(args[0]);
      double b = Double.parseDouble(args[1]);
      double result = service.compute(a, b);
      System.out.println(String.format("%s 더하기 %s 는 %s 이다.", a, b, result));
  } 
}
javac -d ./target/classes/ ./src/main/java/com/example/app/App.java



8. App 실행


java com.example.app.App

# 두 개의 인수를 주세요!

java com.example.app.App 5 7

# 5.0 더하기 7.0 는 12.0 이다.



9. 필요한 jar 파일 import


파일을 다운 후 lib 폴더에 넣어준다. https://jar-download.com/

mkdir ./lib
// App.java
package com.example.app;

import org.apache.kafka.clients.consumer.ConsumerRecord;
import org.apache.kafka.clients.consumer.ConsumerRecords;
import org.apache.kafka.clients.consumer.KafkaConsumer;

import java.util.Arrays;
import java.util.Properties;

public class App {
    public static void main(String[] args) {

        String topic_name = "topic";
        String consumer_group = "topic_group";

        Properties configs = new Properties();
        configs.put("bootstrap.servers", "IP:PORT"); // kafka server host 및 port
        configs.put("session.timeout.ms", "10000"); // session 설정
        configs.put("group.id", consumer_group);   // consumer 설정
        // configs.put("key.deserializer", "org.apache.kafka.common.serialization.StringDeserializer");    // key deserializer
        // configs.put("value.deserializer", "org.apache.kafka.common.serialization.StringDeserializer");  // value deserializer

        KafkaConsumer<String, String> consumer = new KafkaConsumer<String, String>(configs);    // consumer 생성
        consumer.subscribe(Arrays.asList(topic_name)); // topic 설정

        while (true) {
            ConsumerRecords<String, String> records = consumer.poll(500);
            for (ConsumerRecord<String, String> record : records) {
                String input = record.topic();
                if (consumer_group.equals(input)) {
                    System.out.println(record.value());
                } else {
                    throw new IllegalStateException("get message on topic " + record.topic());
                }
            }
        }
    }
}

컴파일은 lib 에 들어있는 모든 jar를 포함시켜줘야 한다.

javac -d ./target/classes/ -cp ./lib/kafka-clients-2.6.0.jar:./lib/lz4-java-1.7.1.jar:./lib/slf4j-api-1.7.30.jar:./lib/snappy-java-1.1.7.3.jar:./lib/zstd-jni-1.4.4-7.jar:./target/classes ./src/main/java/com/example/app/App.java

# or 

javac -d ./target/classes/ -cp ./lib/*:./target/classes ./src/main/java/com/example/app/App.java



10. jar 파일 만들기


jar 파일로 만들어 앱을 실행시켜 보자. 경로를 target/classes 를 이동시켜 target 경로에 app.jar 파일을 만든다.

jar cfv ../app.jar .
  • c : 자바 아카이브 파일을 생성
  • f : 파일 이름을 정한다.
  • v : 콘솔에 진행상황을 출력한다.
added manifest



11. jar 파일 실행하기


java -cp app.jar com.example.app.App



12. Manifest 추가 후 실행


resources 폴더에 MANIFEST.TXT 파일을 만들고 추가

Main-Class: com.example.app.App

cd ../../../target/classes
jar cfvm ../app.jar ../../src/main/resources/MANIFEST.TXT .

target 으로 이동해 앱 실행

java -jar app.jar