Изящно закрывая JVM, когда файл JAR удаляется - PullRequest
1 голос
/ 28 января 2020

System.getProperty("java.class.path") возвращает список файлов JAR, которые использует процесс java. У меня есть серверный процесс, который должен корректно завершить работу, когда любой из этих файлов JAR будет удален. На сервере есть сторожевой поток, который может остановить процесс, если какой-либо из файлов jar будет удален.

Мой вопрос связан с тем, как найти, был ли удален какой-либо jar (удалено / изменено разрешение) или нет.

Один из способов определить, был ли удален какой-либо jar-файл, - периодически проверять, возвращает ли File.exists значение true или нет для каждого из файлов jar-файлов.

Есть ли какая-либо поддержка со стороны jvm для получения этой информации без ручной проверки состояния файла каждый раз? Каков наилучший способ определить, являются ли все файлы JAR целыми или нет?

Спасибо.

Ответы [ 2 ]

1 голос
/ 28 января 2020

Вот пример кода, который делает то, на что указал @ rzwitserl oop. Пример кода основан на примере, предоставленном в https://docs.oracle.com/javase/tutorial/essential/io/notification.html. Вам нужно будет выполнить тест производительности для случая просмотра нескольких папок и при возникновении нескольких событий.

public class CPChangeListeningJava{

    public static void main( String[] args ){
        /* Store the classpath to check against during an event. */
        String cp = System.getProperty( "java.class.path" );

        /* For every unique directory in the classpath, create a WatchService. (Only one case shown here.) */
        try{
            WatchService watcher = FileSystems.getDefault().newWatchService();

            String dirStr = "C:\\SKN\\Workspaces\\General\\ctools\\target"; //One of the paths in the classpath
            Path dir = Paths.get( dirStr );
            try{
                WatchKey key = dir.register( watcher, ENTRY_CREATE, ENTRY_DELETE, ENTRY_MODIFY );

                while( true ){
                    try{
                        key = watcher.take();
                    }
                    catch( InterruptedException x ){
                        return;
                    }

                    for( WatchEvent<?> event : key.pollEvents() ){
                        WatchEvent.Kind<?> kind = event.kind();

                        if( kind == OVERFLOW ){
                            continue;
                        }

                        // The filename is the context of the event.
                        WatchEvent<Path> ev = (WatchEvent<Path>) event;
                        Path filename = ev.context();

                        /* If the file is present in the classpath, process it. */
                        String fullFilePath = dirStr + "\\" + filename; //You may want to check based on Path instances
                        if( cp.contains( fullFilePath ) ) System.out.println( filename + ": " + ev.kind() );
                    }

                    /* Reset the key to receive further watch events. */
                    boolean valid = key.reset();
                    if( !valid ) break;
                }
            }
            catch( IOException x ){
                System.err.println( x );
            }
        }
        catch( IOException e ){
            // TODO Auto-generated catch block
            e.printStackTrace();
        }
    }

}
1 голос
/ 28 января 2020

В ВМ нет функции, которая бы специально наблюдала за банками на пути к классам, нет; Вы должны сами запрограммировать это, собрав jar-файлы из свойства j. c .p и используя WatchService для их отслеживания.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...