我想从使用 Maven IntelliJ 编译的 JAR 程序中恢复 JSON 列表。当我在命令提示符中执行它时它起作用,但当我想在 PHP 中恢复列表时它不起作用。你有想法吗?
PHP程序:
<?php
ini_set('display_errors', 1);
error_reporting(E_ALL);
// Paramètres passés depuis PHP
$startId = 1; // Exemple : récupérer ces valeurs dynamiquement
$endId = 5412;
// Chemin vers le fichier JAR Java
$javaJarPath = '../assets/TRAVIA-1.0-SNAPSHOT-jar-with-dependencies.jar';
// Construire la commande avec les arguments
$command = "java -jar " . escapeshellarg($javaJarPath) . " " . escapeshellarg($startId) . " " . escapeshellarg($endId) . " 2>&1";
$output = shell_exec($command);
// Vérification de l'erreur d'exécution
if ($output === null) {
echo "Erreur d'exécution de la commande. Vérifiez les permissions ou la configuration du serveur.";
} else {
// Convertir l'encodage en UTF-8 pour éviter des problèmes avec les caractères spéciaux
$output = mb_convert_encoding($output, 'UTF-8', 'auto');
echo "<pre>" . htmlspecialchars($output) . "</pre>"; // Afficher la sortie brute pour débogage
// Vérifier si la sortie est vide
if (empty($output)) {
echo "Aucune sortie de l'application Java. Vérifiez l'algorithme A* côté Java.";
} else {
// Tenter de décoder la sortie JSON
$resultList = json_decode($output, true);
if (json_last_error() === JSON_ERROR_NONE) {
echo "Liste récupérée depuis Java :<br>";
foreach ($resultList as $item) {
echo htmlspecialchars($item) . "<br>";
}
} else {
echo "Erreur de décodage JSON : " . json_last_error_msg();
}
}
}
?>
Java程序:
package fr.uge.travia;
import com.google.gson.Gson;
import fr.uge.travia.dao.*;
import fr.uge.travia.ffm.AStarPB;
import fr.uge.travia.model.PlanetFFM;
import fr.uge.travia.model.TripFFM;
import java.sql.Connection;
import java.sql.SQLException;
import java.util.ArrayList;
import java.util.List;
import java.util.stream.Collectors;
public class Main {
public static void main(String[] args) throws SQLException {
if (args.length < 2) {
System.out.println("Veuillez fournir deux arguments : startId et endId.");
return;
}
int startId = Integer.parseInt(args[0]);
int endId = Integer.parseInt(args[1]);
Connection conn = Database.connect();
if (conn != null) {
TripsDAO tripsDAO = new TripsDAO(conn);
PlanetDAO planetDAO = new PlanetDAO(conn);
List<Integer> prohibitedRegions = List.of();
List<Integer> prohibitedSectors = List.of();
List<PlanetFFM> planetsFFM = planetDAO.getAllPlanetsFFM(prohibitedRegions, prohibitedSectors);
List<TripFFM> tripsFFM = tripsDAO.getAllTrips(prohibitedRegions, prohibitedSectors, 10);
try {
// Exemple de données de planètes et trajets
List<Integer> result = AStarPB.runAStar(planetsFFM, tripsFFM, startId, endId);
// Si la liste est vide ou contient des résultats
if (result.isEmpty()) {
System.out.println("{\"error\": \"Aucun résultat trouvé pour l'algorithme A*\"}");
} else {
// Convertir la liste en tableau d'entiers
int[] resultArray = new int[result.size()];
for (int i = 0; i < result.size(); i++) {
resultArray[i] = result.get(i);
}
// Utiliser Gson pour convertir le tableau en JSON
Gson gson = new Gson();
String jsonResult = gson.toJson(resultArray);
// Afficher le résultat JSON
System.out.println(jsonResult);
}
} catch (Exception e) {
// Gestion des erreurs
System.out.println("{\"error\": \"Erreur lors de l'exécution de A* : " + e.getMessage() + "\"}");
e.printStackTrace();
}
Database.disconnect();
}
}
}
命令提示符结果:
assets> java -jar ../assets/TRAVIA-1.0-SNAPSHOT-jar-with-dependencies.jar 1 5412
Connected to the database!
Start ID : 1
End ID : 5412
[1,3403,1820,4980,810,4943,2884,198,1166,1633,5412]
Disconnected from the database!
PHP 结果:
Connected to the database!
{"error": "Aucun r?sultat trouv? pour l'algorithme A*"}
Disconnected from the database!
Erreur de décodage JSON : Syntax error
这是一个用A*算法计算两个行星之间最短路径的程序。
如果您的 JAR 程序在命令提示符下运行正常,但在 PHP 中运行失败,则问题可能与服务器环境或 PHP 执行命令的方式有关。你可以试试这个方法:
<?php
ini_set('display_errors', 1);
error_reporting(E_ALL);
// Parameters passed from PHP
$startId = 1; // Example: dynamically retrieve these values
$endId = 5412;
// Path to the Java JAR file
$javaJarPath = '/absolute/path/to/TRAVIA-1.0-SNAPSHOT-jar-with-dependencies.jar';
// Construct the command with arguments
$command = "java -jar " . escapeshellarg($javaJarPath) . " " . escapeshellarg($startId) . " " . escapeshellarg($endId) . " 2>&1";
// Log file for debugging
$logFile = '/absolute/path/to/java_execution.log';
// Initialize output and return variables
$output = [];
$returnVar = 0;
// Execute the command and capture output
exec($command, $output, $returnVar);
// Log the output to a file for debugging
file_put_contents($logFile, "Command: $command\n", FILE_APPEND);
file_put_contents($logFile, "Output:\n" . implode("\n", $output) . "\n", FILE_APPEND);
file_put_contents($logFile, "Return Code: $returnVar\n\n", FILE_APPEND);
// Check for execution errors
if ($returnVar !== 0) {
echo "Error executing command. Return code: $returnVar<br>";
echo "Output:<br><pre>" . htmlspecialchars(implode("\n", $output)) . "</pre>";
exit; // Stop further execution on error
}
// Convert the output array to a single string
$javaOutput = implode("\n", $output);
// Convert encoding to UTF-8 to avoid issues with special characters
$javaOutput = mb_convert_encoding($javaOutput, 'UTF-8', 'auto');
// Display raw output for debugging
echo "<pre>" . htmlspecialchars($javaOutput) . "</pre>";
// Check if the output is empty
if (empty($javaOutput)) {
echo "No output received from the Java application. Check the Java program.";
exit;
}
// Attempt to decode the output as JSON
$resultList = json_decode($javaOutput, true);
// Check for JSON decoding errors
if (json_last_error() !== JSON_ERROR_NONE) {
echo "Error decoding JSON: " . json_last_error_msg();
exit;
}
// Display the JSON data
echo "List retrieved from Java:<br>";
foreach ($resultList as $item) {
echo htmlspecialchars($item) . "<br>";
}
?>
此代码可以处理错误、记录消息和解码 JSON,以确保 JAR 程序顺利运行并正确处理 JSON 输出。
使用代码的步骤:
/absolute/path/to/TRAVIA-1.0-SNAPSHOT-jar-with-dependencies.jar
与 JAR 文件的实际绝对路径。另外,设置
$logFile
日志记录路径。www-data
对于 Web 服务器)。java -jar ...
) 以验证输出是否符合预期。/absolute/path/to/java_execution.log
) 以进行调试(如果有)
出了问题。我希望这对你有用😊