Estoy tratando de ejecutar un archivo exe en la ruta fuera del paquete actual. Mi code.java archivo que se ejecuta es en

%Workspace_path%\Project\src\main\java\com\util\code.java

Sin embargo, el directorio de donde el exe es

%Workspace_path%\Project\src\main\resources\program.exe

Si es posible, parece que la mejor solución sería la de obtener la ruta de acceso absoluta del Proyecto, a continuación, añadir «src\main\recursos\» a ella. Hay una buena manera de hacer esto o hay alguna solución alternativa?
Estoy usando Eclipse, pero sería genial si podría ser utilizado en otros IDEs demasiado. Gracias por la ayuda.

  • ¿qué hace su classpath parece?
  • %Workspace_path%\Proyecto\src\blanco\classes supongo que me podría encontrar «src» de la ruta de clase, a continuación, añadir «main\recursos\»
InformationsquelleAutor roverred | 2013-03-25

2 Comentarios

  1. 4

    De facto enfoque para la resolución de este es el paquete de los EXE como una ruta de clases de recursos. Parece que han arreglado para esto ya.

    Cuando se trabaja con classpath recursos, madura, el programa no debe asumir que el recurso está en el sistema de ficheros. Los recursos pueden ser empaquetados en un archivo JAR, o incluso en un archivo WAR. La única cosa que usted puede confiar en que punto de los métodos estándar para el acceso a los recursos en Java, como he señalado a continuación.

    La manera de resolver su problema, entonces, es el acceso a los recursos de contenido utilizando el estándar de facto de la invocación de de la Clase.getResourceAsStream (o ClassLoader.getResourceAsStream), guardar el contenido en un archivo temporal, y ejecutar ese archivo. Esto garantiza que su programa funciona correctamente, independientemente de su embalaje.

    En otras palabras:

    1. Invocar getClass().getResourceAsStream("/program.exe"). A partir de los métodos estáticos, usted no puede llamar a getClass, a fin de utilizar el nombre de su clase actual en lugar de, como en MyClass.class.getResourceAsStream. Esto devuelve un InputStream.
    2. Crear un archivo temporal, preferentemente, a través de Archivo.createTempFile. Esto devuelve un File objeto de identificar el archivo recién creado.
    3. Abrir una OutputStream a este archivo temporal.
    4. El uso de las dos corrientes para copiar los datos desde el recurso en el archivo temporal. Usted puede utilizar IOUtils.copia si estás en Apache Commons herramientas. No olvides cerrar las dos corrientes cuando haya terminado con este paso.
    5. Ejecutar el programa almacenados en el archivo temporal.
    6. Limpiar.

    En otras palabras (fragmento de código se añadió más tarde):

    private void executeProgramFromClasspath() throws IOException {
        //Open resource stream.
        InputStream input = getClass().getResourceAsStream("/program.exe");
        if (input == null) {
            throw new IllegalStateException("Missing classpath resource.");
        }
    
        //Transfer.
        OutputStream output = null;
        try {
            //Create temporary file. May throw IOException.
            File temporaryFile = File.createTempFile(getClass().getName(), "");
    
            output = new FileOutputStream(temporaryFile);
            output = new BufferedOutputStream(output);
            IOUtils.copy(input, output);
        } finally {
            //Close streams.
            IOUtils.closeQuietly(input);
            IOUtils.closeQuietly(output);
        }
    
        //Execute.
        try {
            String path = temporaryFile.getAbsolutePath();
            ProcessBuilder processBuilder = new ProcessBuilder(path);
            Process process = processBuilder.start();
            process.waitFor();
        } catch (InterruptedException e) {
            //Optional catch. Keeps the method signature uncluttered.
            throw new IOException(e);
        } finally {
            //Clean up
            if (!temporaryFile.delete()) {
                //Log this issue, or throw an error.
            }
        }
    }
    • Nota: el original fragmento de código tenía un error. Si un archivo temporal no puede ser creado, el InputStream no estaba cerrado. Esto fue corregido.
    • Gracias, funciona como un encanto!
  2. 0

    Bien,en su contexto,el proyecto de la raíz es pasar a ser el ruta de acceso actual

    .

    ,que es donde el java.exe empezar a ejecutar,por lo que una manera fácil de hacerlo es:

    String exePath="src\main\resources\program.exe";
    File exeFile=new File(".",exePath);
    System.out.println(exeFile.getAbusolutePath());
    ...

    He probado este código en Eclipse,está bien. Creo que se debe trabajar en diferentes ide.
    Buena Suerte!

Dejar respuesta

Please enter your comment!
Please enter your name here