java собираю проект и выдает Exception in thread "main" java.lang.StackOverflowError

Я собираю проект maven, он работает и я могу его использовать. Но после сборки обычно вижу примерно такое сообщение в консоле:

Exception in thread "main" java.lang.StackOverflowError
at java.io.FileOutputStream.write(FileOutputStream.java:326)
at java.io.BufferedOutputStream.flushBuffer(BufferedOutputStream.java:82)
at java.io.BufferedOutputStream.flush(BufferedOutputStream.java:140)
at java.io.PrintStream.write(PrintStream.java:482)
at sun.nio.cs.StreamEncoder.writeBytes(StreamEncoder.java:221)
at sun.nio.cs.StreamEncoder.implFlushBuffer(StreamEncoder.java:291)
at sun.nio.cs.StreamEncoder.flushBuffer(StreamEncoder.java:104)
at java.io.OutputStreamWriter.flushBuffer(OutputStreamWriter.java:185)
at java.io.PrintStream.write(PrintStream.java:527)
at java.io.PrintStream.print(PrintStream.java:583)
at org.fusesource.jansi.FilterPrintStream.write(FilterPrintStream.java:99)
at org.fusesource.jansi.FilterPrintStream.write(FilterPrintStream.java:107)
at org.fusesource.jansi.FilterPrintStream.print(FilterPrintStream.java:156)
at org.fusesource.jansi.FilterPrintStream.println(FilterPrintStream.java:231)
at org.slf4j.impl.SimpleLogger.write(SimpleLogger.java:318)
at org.slf4j.impl.SimpleLogger.log(SimpleLogger.java:295)
at org.slf4j.impl.SimpleLogger.info(SimpleLogger.java:480)
at org.apache.maven.cli.logging.Slf4jLogger.info(Slf4jLogger.java:59)
at org.codehaus.plexus.archiver.AbstractArchiver$1.hasNext(AbstractArchiver.java:464)
at org.codehaus.plexus.archiver.AbstractArchiver$1.hasNext(AbstractArchiver.java:467)
at org.codehaus.plexus.archiver.AbstractArchiver$1.hasNext(AbstractArchiver.java:467)
at org.codehaus.plexus.archiver.AbstractArchiver$1.hasNext(AbstractArchiver.java:467)
at org.codehaus.plexus.archiver.AbstractArchiver$1.hasNext(AbstractArchiver.java:467)
at org.codehaus.plexus.archiver.AbstractArchiver$1.hasNext(AbstractArchiver.java:467)
at org.codehaus.plexus.archiver.AbstractArchiver$1.hasNext(AbstractArchiver.java:467)
at org.codehaus.plexus.archiver.AbstractArchiver$1.hasNext(AbstractArchiver.java:467)
at org.codehaus.plexus.archiver.AbstractArchiver$1.hasNext(AbstractArchiver.java:467)
at org.codehaus.plexus.archiver.AbstractArchiver$1.hasNext(AbstractArchiver.java:467)
at org.codehaus.plexus.archiver.AbstractArchiver$1.hasNext(AbstractArchiver.java:467)
at org.codehaus.plexus.archiver.AbstractArchiver$1.hasNext(AbstractArchiver.java:467)
at org.codehaus.plexus.archiver.AbstractArchiver$1.hasNext(AbstractArchiver.java:467)
at org.codehaus.plexus.archiver.AbstractArchiver$1.hasNext(AbstractArchiver.java:467)
at org.codehaus.plexus.archiver.AbstractArchiver$1.hasNext(AbstractArchiver.java:467)
at org.codehaus.plexus.archiver.AbstractArchiver$1.hasNext(AbstractArchiver.java:467)
at org.codehaus.plexus.archiver.AbstractArchiver$1.hasNext(AbstractArchiver.java:467)
at org.codehaus.plexus.archiver.AbstractArchiver$1.hasNext(AbstractArchiver.java:467)
at org.codehaus.plexus.archiver.AbstractArchiver$1.hasNext(AbstractArchiver.java:467)
at org.codehaus.plexus.archiver.AbstractArchiver$1.hasNext(AbstractArchiver.java:467)
at org.codehaus.plexus.archiver.AbstractArchiver$1.hasNext(AbstractArchiver.java:467)
at org.codehaus.plexus.archiver.AbstractArchiver$1.hasNext(AbstractArchiver.java:467)
at org.codehaus.plexus.archiver.AbstractArchiver$1.hasNext(AbstractArchiver.java:467)
at org.codehaus.plexus.archiver.AbstractArchiver$1.hasNext(AbstractArchiver.java:467)
at org.codehaus.plexus.archiver.AbstractArchiver$1.hasNext(AbstractArchiver.java:467)
at org.codehaus.plexus.archiver.AbstractArchiver$1.hasNext(AbstractArchiver.java:467)
at org.codehaus.plexus.archiver.AbstractArchiver$1.hasNext(AbstractArchiver.java:467)
at org.codehaus.plexus.archiver.AbstractArchiver$1.hasNext(AbstractArchiver.java:467)
at org.codehaus.plexus.archiver.AbstractArchiver$1.hasNext(AbstractArchiver.java:467)
at org.codehaus.plexus.archiver.AbstractArchiver$1.hasNext(AbstractArchiver.java:467)
at org.codehaus.plexus.archiver.AbstractArchiver$1.hasNext(AbstractArchiver.java:467)
at org.codehaus.plexus.archiver.AbstractArchiver$1.hasNext(AbstractArchiver.java:467)
at org.codehaus.plexus.archiver.AbstractArchiver$1.hasNext(AbstractArchiver.java:467)
at org.codehaus.plexus.archiver.AbstractArchiver$1.hasNext(AbstractArchiver.java:467)
at org.codehaus.plexus.archiver.AbstractArchiver$1.hasNext(AbstractArchiver.java:467)
at org.codehaus.plexus.archiver.AbstractArchiver$1.hasNext(AbstractArchiver.java:467)
at org.codehaus.plexus.archiver.AbstractArchiver$1.hasNext(AbstractArchiver.java:467)
at org.codehaus.plexus.archiver.AbstractArchiver$1.hasNext(AbstractArchiver.java:467)
at org.codehaus.plexus.archiver.AbstractArchiver$1.hasNext(AbstractArchiver.java:467)
at org.codehaus.plexus.archiver.AbstractArchiver$1.hasNext(AbstractArchiver.java:467)
at org.codehaus.plexus.archiver.AbstractArchiver$1.hasNext(AbstractArchiver.java:467)
at org.codehaus.plexus.archiver.AbstractArchiver$1.hasNext(AbstractArchiver.java:467)
at org.codehaus.plexus.archiver.AbstractArchiver$1.hasNext(AbstractArchiver.java:467)
at org.codehaus.plexus.archiver.AbstractArchiver$1.hasNext(AbstractArchiver.java:467)
at org.codehaus.plexus.archiver.AbstractArchiver$1.hasNext(AbstractArchiver.java:467)
at org.codehaus.plexus.archiver.AbstractArchiver$1.hasNext(AbstractArchiver.java:467)
at org.codehaus.plexus.archiver.AbstractArchiver$1.hasNext(AbstractArchiver.java:467)
at org.codehaus.plexus.archiver.AbstractArchiver$1.hasNext(AbstractArchiver.java:467)
at org.codehaus.plexus.archiver.AbstractArchiver$1.hasNext(AbstractArchiver.java:467)
at org.codehaus.plexus.archiver.AbstractArchiver$1.hasNext(AbstractArchiver.java:467)
at org.codehaus.plexus.archiver.AbstractArchiver$1.hasNext(AbstractArchiver.java:467)
at org.codehaus.plexus.archiver.AbstractArchiver$1.hasNext(AbstractArchiver.java:467)
at org.codehaus.plexus.archiver.AbstractArchiver$1.hasNext(AbstractArchiver.java:467)
at org.codehaus.plexus.archiver.AbstractArchiver$1.hasNext(AbstractArchiver.java:467)
at org.codehaus.plexus.archiver.AbstractArchiver$1.hasNext(AbstractArchiver.java:467)
at org.codehaus.plexus.archiver.AbstractArchiver$1.hasNext(AbstractArchiver.java:467)
at org.codehaus.plexus.archiver.AbstractArchiver$1.hasNext(AbstractArchiver.java:467)
at org.codehaus.plexus.archiver.AbstractArchiver$1.hasNext(AbstractArchiver.java:467)
at org.codehaus.plexus.archiver.AbstractArchiver$1.hasNext(AbstractArchiver.java:467)
at org.codehaus.plexus.archiver.AbstractArchiver$1.hasNext(AbstractArchiver.java:467)
at org.codehaus.plexus.archiver.AbstractArchiver$1.hasNext(AbstractArchiver.java:467)
at org.codehaus.plexus.archiver.AbstractArchiver$1.hasNext(AbstractArchiver.java:467)
at org.codehaus.plexus.archiver.AbstractArchiver$1.hasNext(AbstractArchiver.java:467)
at org.codehaus.plexus.archiver.AbstractArchiver$1.hasNext(AbstractArchiver.java:467)
at org.codehaus.plexus.archiver.AbstractArchiver$1.hasNext(AbstractArchiver.java:467)
at org.codehaus.plexus.archiver.AbstractArchiver$1.hasNext(AbstractArchiver.java:467)
at org.codehaus.plexus.archiver.AbstractArchiver$1.hasNext(AbstractArchiver.java:467)
at org.codehaus.plexus.archiver.AbstractArchiver$1.hasNext(AbstractArchiver.java:467)
at org.codehaus.plexus.archiver.AbstractArchiver$1.hasNext(AbstractArchiver.java:467)
at org.codehaus.plexus.archiver.AbstractArchiver$1.hasNext(AbstractArchiver.java:467)
at org.codehaus.plexus.archiver.AbstractArchiver$1.hasNext(AbstractArchiver.java:467)
at org.codehaus.plexus.archiver.AbstractArchiver$1.hasNext(AbstractArchiver.java:467)
at org.codehaus.plexus.archiver.AbstractArchiver$1.hasNext(AbstractArchiver.java:467)
at org.codehaus.plexus.archiver.AbstractArchiver$1.hasNext(AbstractArchiver.java:467)
at org.codehaus.plexus.archiver.AbstractArchiver$1.hasNext(AbstractArchiver.java:467)
at org.codehaus.plexus.archiver.AbstractArchiver$1.hasNext(AbstractArchiver.java:467)
at org.codehaus.plexus.archiver.AbstractArchiver$1.hasNext(AbstractArchiver.java:467)
at org.codehaus.plexus.archiver.AbstractArchiver$1.hasNext(AbstractArchiver.java:467)
at org.codehaus.plexus.archiver.AbstractArchiver$1.hasNext(AbstractArchiver.java:467)
at org.codehaus.plexus.archiver.AbstractArchiver$1.hasNext(AbstractArchiver.java:467)
at org.codehaus.plexus.archiver.AbstractArchiver$1.hasNext(AbstractArchiver.java:467)
at org.codehaus.plexus.archiver.AbstractArchiver$1.hasNext(AbstractArchiver.java:467)
at org.codehaus.plexus.archiver.AbstractArchiver$1.hasNext(AbstractArchiver.java:467)
at org.codehaus.plexus.archiver.AbstractArchiver$1.hasNext(AbstractArchiver.java:467)
at org.codehaus.plexus.archiver.AbstractArchiver$1.hasNext(AbstractArchiver.java:467)

Мой код ф-ции main:

public static void main(String[] args) throws IOException, SAXException, TikaException, InterruptedException, FileNotFoundException, JDOMException {
        
        numberQueue = 0; //Кол-во элементов в очереди
        //Если запускать из среды: путь до файла config.xml
        linkFileConfig = "D:\\Programs\\Qt\\Units\\MyJavaProjects\\"
                + "Qt-Java\\build-JavaQt-Desktop_Qt_5_9_1_MSVC2015_64bit-Profile\\"
                + "release\\config.xml";
//Использование logging---------------------------------------------------------
   
        //Путь к файлу Log.txt
        String linkLogFile = linkFileConfig.replace("config.xml", "Log.txt");
        //Поток4 - Запись ошибок в файл Log.txt
        threadWriteLog = new LogWritter(linkLogFile);
        new Thread(threadWriteLog, "threadWriteLog").start();
//------------------------------------------------------------------------------        
//Новое место для чтения файла config.xml с новыми параметрами------------------
        //Начальная инициализация
        oldCores = 0;
        threadPool = new LinkedBlockingQueue<Runnable>();
        serviceOne = new ThreadPoolExecutor(0, 10, 0L, TimeUnit.MILLISECONDS, threadPool);
        //При первом запуске прочитать config.xml 
        //И сохранить директории
        File configFile = new File(linkFileConfig);
        Path = readConfig(configFile);
//------------------------------------------------------------------------------
        
        //Открывается порт сервера для соединения
        serverSocket = new ServerSocket(8000);  //для отправки результата
        
        //Открывается порт сервера для соединения
        serverSocket2 = new ServerSocket(8001); //для отправки очереди
        
        //Открывается порт сервера для соединения
        serverSocket3 = new ServerSocket(8002); //для отправки очереди
        
        //Сообщение: ждем соединения
        System.out.println("Waiting for connected...");
        
        //Ждем соединения с клиентом Qt
        clientSocket = serverSocket.accept();   //для результата
        //Ждем соединения с клиентом Qt
        clientSocket2 = serverSocket2.accept(); //для очереди 
        writerSocketQueue = new OutputStreamWriter(clientSocket2.getOutputStream());
        
        //Ждем соединения с клиентом Qt
        clientSocket3 = serverSocket3.accept(); //для завершения Java
        readSocket = new BufferedReader(
            new InputStreamReader(clientSocket3.getInputStream()));
        writeSockQt = new OutputStreamWriter(clientSocket3.getOutputStream());
        
        //Поток5 - получаем сообщение от Qt для закрытия Java
        Thread threadCloseJava = new Thread(new Closer());
        threadCloseJava.start();
        
        //Если соединились, тогда обрабатываем и отправляем статус
        //Если соединения нет, то ожидаем его
        while(clientSocket.isConnected()){ 
            sendQueue(numberQueue); //Отправить текущее значение очереди
            //Старый пути (in, out, task)
            oldPath = Path;
            //Поток1 - отслеживаем изм. файла config.mxl
            Thread threadConfig = new Thread(new configThread(linkFileConfig));
            threadConfig.start();
            
            //Поток2 - отслеживаем изм. кол-ва файлов .dat 
            MyThread myThread = new MyThread(linkFileConfig);
            new Thread(myThread, "MyThlread").start();
            
            //Поток3 - отслеживаем изм. кол-ва файлов task.xml
            ReadByte myThreadByte = new ReadByte(linkFileConfig);
            new Thread(myThreadByte, "ReadByte").start();
            boolean isWhile = true; //Для вечного чикла
            while (isWhile) {
                Thread.sleep(10); 
                
                //В файле config.xml был изменен путь до in директории 
                if (isChangeConfig) {
                    System.out.println("File config.xml has been changed by user");
                    
                    //Изменяю флаг в файле MyThread.java
                    myThread.isStop();
                    //File newFile = new File(oldPath[0] + "/in.bat");
                    //Создаю файл (в старой папке) in директории для триггера
                    File newFile = new File(oldPath[0] + File.separator + "in.bat");
                    newFile.createNewFile();
                    
                    //Изменяю флаг в class ReadByte
                    myThreadByte.isStopTask();
                    
                    //Создаю файл в старой папке task для триггера
                    File newSysFileTask = new File(oldPath[2] + File.separator+ "task.bat");
                    newSysFileTask.createNewFile();
                    
                    if(isRead == true){
                    
                        //Прочитать файл заново
                        Path = readConfig(configFile);
                        isRead = false;
                    }
                    
                    
                    //Чтобы ниже не прочитывали конфиг файл
                    isChangeConfig = false;
                    
                    //Равен ли новый in старому in?
                    boolean isEqually = Path[0].equals(oldPath[0]);
                    //не был изменен    = true
                    //был изменен       = false
                    
                    if (isEqually == false) { //в конфиге был изменен in путь
                        isFront = true; //Чтобы зайти в нижний блок
                    }
                    else{ //в конфиге не был изм. in путь 
                    
                        //Чтобы не заходить в нижний блок
                        //Для исключения повторной обработки файлов
                        isFront = false; 
                        isRead = true; 
                    }
                    
                    newFile.delete();        //Удалить файл in.bat
                    newSysFileTask.delete(); //Удалить файл task.bat
                    
                    //Перезаписать старые пути
                    oldPath = Path;
                    
                } //if(isChangeConfig)
                //Если не изменилась, то исп. старый Path[0]  
                File dir = new File(Path[0]); //Директория выборки
                //Filter для выборки только файлов psp
                FileFilter filter = new FileFilter() {
                    @Override
                    public boolean accept(File dir) {
                        return dir.getName().endsWith("dat");
                    }
                }; // конец Filter
                //Сохранить в массив файлы .psp, исходя из Filter
                File[] files = dir.listFiles(filter); //(00001.psp, 00001.dat) 
                int i = 0;
                //Если файлов нет, то будет проход выше
                if (files.length == 0) {
                    //Разрешить в верхнем блоке читать конфиг
                    isRead = true;
                    isFront = false;
                }
                
                if (isFront) {
                    
                    //Начинаем проход по файлам того массива
                    for (File file : files) {
                        // Получить абсолютное имя файла (psp & dat)     
                        String fileDat = file.getAbsolutePath(); //00001.psp
                        if (isChangeConfig) { //Если файл изменился, то
                            //Прочитываю файл config.xml
                            Path = readConfig(configFile);
                            
                            //Равен ли новый путь старому
                            boolean isEqually = Path[0].equals(oldPath[0]);
                            
                            //не был изменен    = true
                            //был изменен       = false
                            
                            if(isEqually == false){ //в конфиге был изменен in путь
                                //Уже прочитали конфиг, 
                                //не разрешаем еще раз его читать                                
                                isRead = false;
                                //Выйти из for и перейти на проверку в while
                                break;
                            }
                            else{ //в конфиге не был изменен in путь
                                //Изменяю флаг в class ReadByte
                                myThreadByte.isStopTask();
                                //Создаю файл в папке task для триггера
                                File newSysFileTask = new File(oldPath[2] + File.separator + "task.bat");
                                newSysFileTask.createNewFile();
                                //Удалить файл task.bat
                                newSysFileTask.delete();
                                
                                //Перезапись старого in
                                oldPath = Path;
                                
                                //Чтобы не заходить в секцию еще раз
                                isChangeConfig = false;
                                
                                System.out.println("Текущий файл идет на обработку: " + file.getName());
                                
                                serviceOne.submit(new Task(fileDat));
                                numberQueue++; //Изменить значение очереди
                                i++; //Какой сейчас файл в цикле
                               
                                sendQueue(numberQueue); //Отправить это значение
                            }
                            
                        } else {//Если не изменился конфиг файл, то создать поток обработки
                            System.out.println("Текущий файл идет на обработку: " + file.getName());
                            
                            serviceOne.submit(new Task(fileDat));
                            numberQueue++; //Изменить значение очереди
                            i++; //Какой сейчас файл в цикле 
                            
                            sendQueue(numberQueue); //Отправить это значение
                        }
                        //Если обработали последний файл, то уже не идем на обработку
                        if ((files.length) == i) {
                            //System.out.println("Последний файл");
                            isFront = false;
                            
                            //Разрешаем в верхнем блоке чтение конфига 
                            isRead = true;
                            
                            //Чтобы лишний раз не идти на проверку for
                            break;
                        }
                    } //for - по файлам массива
                }//if
                
            }//while (isWhile)
        } //while(clientSocket.isConnected())
        
    }//main

Я почитал, и узнал, что StackOverFlow появляется при переполнении стека. Но все равно не могу понять причину появления exception. Не могу понять как эти строчки могут быть причиной переполнения. Подскажите как быть в такой ситуации, на что можно взглянуть, чтобы решить ее? Может, есть какой-то другой подход? Заранее спасибо, буду рад любому совету.


Мой текущий pom.xml, сборка через maven:

<build>
    <plugins>
        <plugin>
            <groupId>org.apache.maven.plugins</groupId>
            <artifactId>maven-dependency-plugin</artifactId>
            <executions>
                <execution>
                    <id>copy-dependencies</id>
                    <phase>prepare-package</phase>
                    <goals>
                        <goal>copy-dependencies</goal>
                    </goals>
                    <configuration>
                        <outputDirectory>${project.build.directory}/lib</outputDirectory>
                        <overWriteReleases>false</overWriteReleases>
                        <overWriteSnapshots>false</overWriteSnapshots>
                        <overWriteIfNewer>true</overWriteIfNewer>
                    </configuration>
                </execution>
            </executions>
        </plugin>

        <plugin>
            <groupId>org.apache.maven.plugins</groupId>
            <artifactId>maven-jar-plugin</artifactId>
            <version>3.2.0</version>
            <configuration>
            <archive>
                <manifest>
                   <addClasspath>true</addClasspath>
                   <classpathPrefix>lib/</classpathPrefix>
                   <mainClass>com.mycompany.stackexp.Parser</mainClass>
                   
                   <addDefaultImplementationEntries>true</addDefaultImplementationEntries>
               <addDefaultSpecificationEntries>true</addDefaultSpecificationEntries>
                </manifest>
            </archive>
            <source>1.5</source>
            <target>1.5</target>
            </configuration>
        </plugin>
                  
        <plugin>
            <groupId>org.apache.maven.plugins</groupId>
            <artifactId>maven-source-plugin</artifactId>
            <version>3.2.1</version>
            <executions>
                <execution>
                    <id>attach-sources</id>
                    <goals>
                       <goal>jar</goal>
                    </goals>
                </execution>
            </executions>
        </plugin>
        
        <plugin>
            <artifactId>maven-assembly-plugin</artifactId>
            <configuration>
                <archive>
                    <manifest>
                        <mainClass>com.mycompany.stackexp.Parser</mainClass>
                    </manifest>
                </archive>
                <descriptorRefs>
                    <descriptorRef>jar-with-dependencies</descriptorRef>
                </descriptorRefs>
            </configuration>
            <executions>
                <execution>
                    <id>make-assembly</id> <!-- this is used for inheritance merges -->
                    <phase>package</phase> <!-- bind to the packaging phase -->
                    <goals>
                        <goal>single</goal>
                    </goals>
                </execution>
            </executions>
        </plugin> 
    </plugins>
</build>

Ответы (1 шт):

Автор решения: Roman Danilov

Добавьте version и groupId в ваш maven-assembler-plugin, чтобы привести его в порядок:

<groupId>org.apache.maven.plugins</groupId>
<version>3.2.0</version>

Чтобы это выглядело следующим образом:

       <plugin>
            <groupId>org.apache.maven.plugins</groupId>
            <artifactId>maven-assembly-plugin</artifactId>
            <version>3.2.0</version>
            <configuration>
                <archive>
                    <manifest>
                        <mainClass>com.mycompany.stackexp.Parser</mainClass>
                    </manifest>
                </archive>
                <descriptorRefs>
                    <descriptorRef>jar-with-dependencies</descriptorRef>
                </descriptorRefs>
            </configuration>
            <executions>
                <execution>
                    <id>make-assembly</id> <!-- this is used for inheritance merges -->
                    <phase>package</phase> <!-- bind to the packaging phase -->
                    <goals>
                        <goal>single</goal>
                    </goals>
                </execution>
            </executions>
        </plugin>
→ Ссылка