JAR 在命令提示符下有效,但在 PHP 中无效

问题描述 投票:0回答:1

我想从使用 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*算法计算两个行星之间最短路径的程序。

java php jar
1个回答
0
投票

如果您的 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 输出。

使用代码的步骤:

  • 1。替换路径:更新
    /absolute/path/to/TRAVIA-1.0-SNAPSHOT-jar-with-dependencies.jar
    与 JAR 文件的实际绝对路径。另外,设置
    $logFile
    日志记录路径。
  • 2。检查权限: 确保 PHP 用户可以访问 JAR 文件和日志目录(例如,
    www-data
    对于 Web 服务器)。
  • 3.验证 Java 输出: 确保 Java 程序输出有效的 JSON。如果没有,请调整 Java 代码以确保它可以。
  • 4。在命令行中测试: 直接在终端中运行相同的命令 (
    java -jar ...
    ) 以验证输出是否符合预期。
  • 5。查看日志: 检查日志文件 (
    /absolute/path/to/java_execution.log
    ) 以进行调试(如果有) 出了问题。

我希望这对你有用😊

© www.soinside.com 2019 - 2024. All rights reserved.