Мне нужна помощь с этой концепцией. Я просмотрел несколько тем на этом форуме, но ни одна из них не решила мою проблему.
Я пишу два класса Java и сценарий оболочки. Я заархивирую их в папку и отправляю другому человеку, который не знает java. Он просто распаковывает и запускает сценарий оболочки.
Человек извлечет код в любом месте своей машины. Итак, теперь сценарий оболочки должен делать следующее.
Мой 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;
}
}




Вы можете установить путь класса к текущей папке в сценарии оболочки, например:
экспорт CLASSPATH = $ CLASSPATH: .
Таким образом, он сможет найти класс Player в той же папке.
да. Переменная пути к классу будет называться CLASSPATH в среде Linux, и вы можете использовать ее, добавив знак $ непосредственно перед именем, например: echo $ CLASSPATH
В строке выше экспорт устанавливает для переменной CLASSPATH значение, которое было, и также добавляет "." к пути к классам. в Linux - точка "." относится к текущей папке.
echo $ CLASSPATH ничего не печатает. Я пробовал% CLASSPATH,% CLASSPATH%, $ CLASSPATH. но ни один из них не дает результата. Я попытался указать $ (which java), но он печатает путь java.exe. Не могли бы вы помочь? Я не программист unix, но я должен давать эти команды для создания скрипта.
Теперь он должен работать с вашими изменениями. Не могли бы вы опубликовать исходный код из App.java и Message.java, чтобы я мог попробовать его на своей машине?
Хорошо, теперь я понимаю, что происходит. Когда вы указываете пакет в java, ожидается, что пакет будет отражать иерархию папок, в которой расположен файл .java. Поскольку вы указали пакет как com.demo, вам потребуется файловая структура наподобие com / demo / App.java. Честно говоря, самое простое, что вы можете сделать для выполнения этой работы, - это удалить объявление пакета в первой строке App.java. Кроме того, в MyCodeExecution.sh вам необходимо удалить строку javac Message.java, поскольку у вас нет такого файла (класс сообщения был объявлен в App.java).
Я не знаю, каков путь класса Java на другой машине? Можно ли написать команды оболочки для поиска переменной среды java на машине?