Как мы можем установить путь к классам Java в сценарии оболочки?

Мне нужна помощь с этой концепцией. Я просмотрел несколько тем на этом форуме, но ни одна из них не решила мою проблему.

Я пишу два класса Java и сценарий оболочки. Я заархивирую их в папку и отправляю другому человеку, который не знает java. Он просто распаковывает и запускает сценарий оболочки.

Человек извлечет код в любом месте своей машины. Итак, теперь сценарий оболочки должен делать следующее.

  1. Проверьте, правильно ли установлена ​​Java
  2. Если это так, установите путь к классу java в папку, в которой находятся классы java.
  3. Проверить версию java. Это достигается в сценарии. Так что нет проблем
  4. Скомпилируйте и запустите.

Мой zip-файл будет содержать App.java, Message.java, MyCodeExecution.sh.

    #!/bin/bash

    export CLASSPATH=$CLASSPATH:.

    echo $CLASSPATH

    VER=`java -version 2>&1 | grep "java version" | awk '{print $3}' 
    | tr   -d \" | awk '{split($0, array, ".")} END{print array[2]}'`
    if [[ $VER -gt 6 ]]; then
        echo "Java version is greater than 1.6."
    else
        echo "Java version is lower than 1.6."
    fi

    javac App.java
    javac Message.java
    java App

Это мой код для сообщений и App.java

  package com.demo;

    import java.io.BufferedReader;
    import java.io.IOException;
    import java.io.InputStreamReader;

    /**
     * This class creates two instances of same class and performs message
     * transmission.
     * 
     */
    public class App {
        final static String initTurn = "initiator";
        final static String receiverTurn = "receiver";



        public static void main(String[] args) {
            App app = new App();
            InputStreamReader r = new InputStreamReader(System.in); // Input reader for messages
            InputStreamReader totalMessages = new InputStreamReader(System.in); // Input reader to get total number of
                                                                                // messages
            BufferedReader br = null;
            Message initiator = new Message(); /* Instance for initiator who initiates the message */
            Message receiver = new Message(); /* Instance for receiver who receives and re-sends the message. */

            String initMessage = null; /* Message got from the initiator */
            String recvMessage = null; /* Message to be sent back to initiator by receiver */
            String turn = initTurn; /* Turn to send message by initiator or receiver. */
            try {

                /*
                 * This snippet is implemented to give option of sending n number of messages
                 * and receive it. User can choose to transmit total number of messages
                 */
                int c = 0;
                 System.out.println("How many messages do you wish to transmit? ");

                br = new BufferedReader(totalMessages);
                c = Integer.parseInt(br.readLine());

                /* br object is reset for receiving messages from user. */
                br = null;
                br = new BufferedReader(r);
                for (int counter = 1; counter <= c;) { /*
                                                         * Message transmission stops when initiator reach the transmission
                                                         * limit
                                                         */
                    if (initTurn.equals(turn)) {
                        System.out.println("\nInitiator... Please type your message:\n ");
                        if (counter == c) {
                             System.out.println("This would be the last message which you may sent and receive.\n");

                        }
                        /* Receiving message as input by initiator. */
                        initMessage = br.readLine();
                        turn = receiverTurn; /*
                                                 * turn is set to receiver that is transmission turn is now given to
                                                 * receiver.
                                                 */
                        initiator.setMessage(initMessage);
                    } else if (receiverTurn.equals(turn)) {
                        /* Receiver gets message from Initiator */
                        receiver.setMessage(initiator.getMessage());
                        recvMessage = receiver.getMessage();
                        /* Receiver re-sends the message to the initiator with the message counter. */
                         System.out.println("\nMessage received by Initiator from Receiver is: ' " +
                         recvMessage
                         + "'. Message counter " + counter);

                        if (counter == c) {
                            System.out.println("\nMessage transmission limit over. See you again.");
                        }
                        turn = initTurn; /*
                                             * turn is set to receiver that is transmission turn is now given to initiator.
                                             */
                        counter++;
                    }
                }

            } catch (IOException e) {
                e.printStackTrace();
            } finally {
                if (br != null) {
                    try {
                        br.close();
                    } catch (IOException ie) {
                        ie.printStackTrace();
                    }
                }
                if (totalMessages != null) {
                    try {
                        totalMessages.close();
                    } catch (IOException ie) {
                        ie.printStackTrace();
                    }
                }
                if (r != null) {
                    try {
                        r.close();
                    } catch (IOException ie) {
                        ie.printStackTrace();
                    }
                }
            }

        }
    }

    class Message {

        String message;

        public String getMessage() {
            return message;
        }

        public void setMessage(String message) {
            this.message = message;
        }

    }
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
В компьютерном программировании биты играют важнейшую роль в представлении и манипулировании данными на двоичном уровне. Побитовые операции...
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Приходилось ли вам сталкиваться с требованиями, в которых вас могли попросить поднять тревогу или выдать ошибку, когда метод Java занимает больше...
Полный курс Java для разработчиков веб-сайтов и приложений
Полный курс Java для разработчиков веб-сайтов и приложений
Получите сертификат Java Web и Application Developer, используя наш курс.
0
0
3 133
1

Ответы 1

Вы можете установить путь класса к текущей папке в сценарии оболочки, например:
экспорт CLASSPATH = $ CLASSPATH: .
Таким образом, он сможет найти класс Player в той же папке.

Я не знаю, каков путь класса Java на другой машине? Можно ли написать команды оболочки для поиска переменной среды java на машине?

Sujatha Rajesh 11.12.2018 10:44

да. Переменная пути к классу будет называться CLASSPATH в среде Linux, и вы можете использовать ее, добавив знак $ непосредственно перед именем, например: echo $ CLASSPATH

fpezzini 11.12.2018 11:09

В строке выше экспорт устанавливает для переменной CLASSPATH значение, которое было, и также добавляет "." к пути к классам. в Linux - точка "." относится к текущей папке.

fpezzini 11.12.2018 11:10

echo $ CLASSPATH ничего не печатает. Я пробовал% CLASSPATH,% CLASSPATH%, $ CLASSPATH. но ни один из них не дает результата. Я попытался указать $ (which java), но он печатает путь java.exe. Не могли бы вы помочь? Я не программист unix, но я должен давать эти команды для создания скрипта.

Sujatha Rajesh 13.12.2018 15:33

Теперь он должен работать с вашими изменениями. Не могли бы вы опубликовать исходный код из App.java и Message.java, чтобы я мог попробовать его на своей машине?

fpezzini 14.12.2018 15:35

Хорошо, теперь я понимаю, что происходит. Когда вы указываете пакет в java, ожидается, что пакет будет отражать иерархию папок, в которой расположен файл .java. Поскольку вы указали пакет как com.demo, вам потребуется файловая структура наподобие com / demo / App.java. Честно говоря, самое простое, что вы можете сделать для выполнения этой работы, - это удалить объявление пакета в первой строке App.java. Кроме того, в MyCodeExecution.sh вам необходимо удалить строку javac Message.java, поскольку у вас нет такого файла (класс сообщения был объявлен в App.java).

fpezzini 18.12.2018 14:37

Другие вопросы по теме