java - спецификация - w3c specification




Почему он блокирует lib/modules? (2)

Когда я запускаю любое стороннее приложение, например Блокнот (но вы можете взять что-нибудь еще), из приложения Java 9, а затем выходите из приложения Java:

import java.io.*;

public class LaunchNotepad {
  public static void main(String[] args) throws IOException {
    Runtime.getRuntime().exec(new String[] {"C:\\Windows\\notepad.exe"});
  }
}

запущенное стороннее приложение блокирует файл lib\modules Java 9. Это затрудняет обновление нашего Java-приложения с частной JRE, поскольку исходный каталог (содержащий JRE) не может быть переименован. Вот скриншот из ProcessExplorer (Sysinternals):

Это пахнет как ошибка Java 9 (сообщается как JDK-8194734 ), но есть ли JDK-8194734 запустить приложение в Windows без блокировки файла lib\modules , например, с помощью внешнего (прокси) приложения, которое просто запускает переданный файл параметр как приложение?


Если у вас есть контракт Oracle Java Support, вы должны пройти через каналы поддержки, чтобы узнать, когда будет исправление.

ОБНОВЛЕНИЕ - Основываясь на bugs.openjdk.java.net/browse/JDK-8194734 , текущий ответ, вероятно, будет «когда Java 11 выпущен». Но Oracle может решить перенести исправление в Java 9 и 10.

Если вы действительно нуждаетесь в исправлении, подумайте над тем, чтобы сделать следующее:

  1. Загрузите исходный код OpenJDK и создайте свою собственную JVM.

  2. Выясните, где ошибка. Вы, кажется, знаете, что это такое, поэтому не должно быть трудно понять, где искать.

  3. Разработайте исправление для ошибки.

  4. Внесите исправление в проект OpenJDK в виде патча.

Это увеличит вероятность того, что проблема будет исправлена ​​раньше в стандартной кодовой базе и созданных из нее дистрибутивах. Это также даст вам обходной путь для внутреннего тестирования и для клиентов, которые готовы использовать вашу «фиксированную» JVM.

Я упомянул один возможный обходной путь, который включал переработку вашего кода, который вы отвергли из-под контроля. Есть и другие тоже. AFAIK нет обходных путей, которые не связаны с работой для вас, так или иначе.


Я исправил эту ошибку . Это считается обходным решением? :)

В противном случае некоторые обходные пути действительно возможны.

Обходной путь 1: используйте awt.Desktop

Просматривая источники Java, я обнаружил, что awt.Desktop может вызвать для нас ShellExecute .

К сожалению, этот метод не позволяет передавать аргументы командной строки. Вы можете записать временный пакетный файл на диск и запустить его как обходной путь.

import java.io.*;
import java.awt.Desktop;

public class LaunchNotepad {
  public static void main(String[] args) throws IOException {
    File program = new File("C:\\Windows\\notepad.exe");
    Desktop.getDesktop().open(program);
  }
}

Обходной путь 2: используйте PsExec в качестве прокси

SysInternals PsExec не наследует файлы в процессах, запущенных с ним. Не забудьте использовать параметр -d , иначе PsExec будет содержать файл.

Использование cmd.exe качестве прокси невозможно, потому что он всегда наследует дескрипторы.

Обходной путь 3: Создайте свой собственный прокси

Вам нужно будет использовать один из двух WINAPI: CreateProcess (с указанием bInheritHandles=FALSE ) или ShellExecute .





java-9