Как использовать файл JAR для отображения заставки?

package misc;

import java.awt.*;
import java.awt.event.*;

public class SplashDemo extends Frame implements ActionListener {

    static void renderSplashFrame(Graphics2D g, int frame) {
        final String[] comps = {"foo", "bar", "baz"};
        g.setComposite(AlphaComposite.Clear);
        g.fillRect(120,140,200,40);
        g.setPaintMode();
        g.setColor(Color.BLACK);
        g.drawString("Loading "+comps[(frame/5)%3]+"...", 120, 150);
    }
    public SplashDemo() {
        super("SplashScreen demo");
        setSize(300, 200);
        setLayout(new BorderLayout());
        Menu m1 = new Menu("File");
        MenuItem mi1 = new MenuItem("Exit");
        m1.add(mi1);
        mi1.addActionListener(this);
        this.addWindowListener(closeWindow);

        MenuBar mb = new MenuBar();
        setMenuBar(mb);
        mb.add(m1);
        
        //
        final SplashScreen splash = SplashScreen.getSplashScreen();
        if (splash == null) {
            System.out.println("SplashScreen.getSplashScreen() returned null");
            return;
        }
        Graphics2D g = splash.createGraphics();
        if (g == null) {
            System.out.println("g is null");
            return;
        }
        for(int i=0; i<50; i++) {
            renderSplashFrame(g, i);
            splash.update();
            try {
                Thread.sleep(90);
            }
            catch(InterruptedException e) {
            }
        }
        splash.close();
        
        // setVisible(true);
        // toFront();
    }
    public void actionPerformed(ActionEvent ae) {
        System.exit(0);
    }
    
    private static WindowListener closeWindow = new WindowAdapter(){
        public void windowClosing(WindowEvent e){
            e.getWindow().dispose();
        }
    };
}

В основном классе JAR:

public static void main(String[] args) {
    new SplashDemo(); //splash with image
    ...

Когда я запускаю его из консоли, я получаю

SplashScreen.getSplashScreen() вернул ноль

Папки проекта следующие:

project root > src > misc > SplashDemo.java
project root > src > main > resources > META-INF > MANIFEST.MF
// made a few locations for the picture to pick up from somewhere.
project root > src > main > resources > images > `image here`
project root > images > `image here`
project root > src > images > `image here`

и файл манифеста

Manifest-Version: 1.0
Main-Class: main.MainClassName
SplashScreen-Image: images/splash.gif

pom-файл

<project xmlns:xsi = "http://www.w3.org/2001/XMLSchema-instance"
    xmlns = "http://maven.apache.org/POM/4.0.0"
    xsi:schemaLocation = "http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">

    <modelVersion>4.0.0</modelVersion>
    <groupId>com.creator</groupId>
    <artifactId>myapp</artifactId>
    <version>0.1.0-SNAPSHOT</version>
    <packaging>jar</packaging>

    <dependencies> ... </dependencies>

    <build>
        <sourceDirectory>src</sourceDirectory>

        <plugins>
            <plugin>
                <groupId>org.apache.maven.plugins</groupId>
                <artifactId>maven-compiler-plugin</artifactId>
                <version>3.7.0</version>
                <configuration>
                    <source>${project.java.version}</source>
                    <target>${project.java.version}</target>
                    <encoding>${project.build.sourceEncoding}</encoding>
                </configuration>
            </plugin>
            <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}/libs
                            </outputDirectory>
                        </configuration>
                    </execution>
                </executions>
            </plugin>
            <plugin>
                <groupId>org.apache.maven.plugins</groupId>
                <artifactId>maven-jar-plugin</artifactId>
                <version>3.3.0</version>
                <configuration>
                    <archive>
                        <manifest>
                            <addClasspath>true</addClasspath>
                            <classpathPrefix>libs/</classpathPrefix>
                            <mainClass>main.MainClassName</mainClass>
                        </manifest>
                    </archive>
                </configuration>
            </plugin>
        </plugins>

    </build>
</project>

Однако приложение не создавало заставку при запуске с помощью параметра файла манифеста, то есть метод getSplashScreen возвращает значение null. Как это исправить?

Созданный JAR-файл содержит папку images с изображением в корне.

Посмотрите пост stackoverflow.com/questions/67685595/…

Adil Shaikh 31.08.2024 09:48

@AdilShaikh Я добавил в maven-jar-plugin строку <manifestFile>src/main/resources/META-INF/MANIFEST.MF</manif‌​estFile>, как показано в ссылке, но ошибка все та же. Что интересно, в сгенерированном jar-файле MANIFEST больше нет строки SplashScreen-Image - так и должно быть?

rozerro 31.08.2024 10:16

скорее всего, файл MANIFEST.MF вообще не используется, поскольку он создан Maven. Откройте файл JAR (WinZip, 7-zip, jar или аналогичный) и проверьте содержимое файла MANIFST.MF — скорее всего, вам необходимо добавить атрибут заставки в запись манифеста в файле pom (извините, я не использую Мавен)

user85421 31.08.2024 11:15

@user85421 user85421 да, это работает, спасибо, но должна быть причина, по которой это не работает с maven

rozerro 31.08.2024 12:20

вы использовали Maven для создания файла манифеста (путем добавления записи <manifest>), поэтому он его создает, предоставленный файл не используется (опять же, я не использую Maven, просто догадываюсь)

user85421 31.08.2024 12:23

@user85421 user85421, наверное, ты прав. Я открыл манифест из jar, и там был Created-By: Maven JAR Plugin 3.4.2, поэтому он воссоздал его и не использовал запись файла из файла манифеста исходного кода.

rozerro 31.08.2024 12:56
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
В компьютерном программировании биты играют важнейшую роль в представлении и манипулировании данными на двоичном уровне. Побитовые операции...
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Приходилось ли вам сталкиваться с требованиями, в которых вас могли попросить поднять тревогу или выдать ошибку, когда метод Java занимает больше...
Полный курс Java для разработчиков веб-сайтов и приложений
Полный курс Java для разработчиков веб-сайтов и приложений
Получите сертификат Java Web и Application Developer, используя наш курс.
2
6
67
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

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

<plugin>
    <groupId>org.apache.maven.plugins</groupId>
    <artifactId>maven-jar-plugin</artifactId>
    <version>3.3.0</version>
    <configuration>
        <archive>
            <manifest>
                <addClasspath>true</addClasspath>
                <classpathPrefix>libs/</classpathPrefix>
                <mainClass>misc.SplashDemo</mainClass>
            </manifest>
            <manifestEntries>
                <SplashScreen-Image>splash.gif</SplashScreen-Image>
            </manifestEntries>
        </archive>
    </configuration>
</plugin>

Демо-zip находится ЗДЕСЬ (mvn package && java -jar target/misc-1.0-SNAPSHOT.jar)

спасибо чувак, похоже мавен придумал враг человеческих душ )

rozerro 31.08.2024 12:28

Другие вопросы по теме

Похожие вопросы

Функции PHP и Java возвращают разные даты при расчете на 6 месяцев вперед
Файл журнала Log4J остается пустым при программной настройке
Почему JPA все еще работает с классом записи как с сущностью?
Приложение Spring Framework возвращает только ошибки 404
Spring: получение ошибки грамматики неправильного sql для именованного параметра – удаление параметра устраняет ошибку
Есть ли в Visual Studio Code сочетания клавиш, которые переключают детали предложения и всплывающие окна режима объяснения в предложениях?
Вывод консоли IntelliJ IDEA неправильно отображает символы вертикальной табуляции (U + 000B)
Ошибка создания bean-компонента с именем «entityManagerFactory», определенным в ресурсе пути к классу: невозможно построить Hibernate SessionFactory;
Как использовать внешние файлы конфигурации для обеспечения специфичных для среды конфигураций в приложении Spring Boot?
Как использовать общие файлы миграции для mysql и h2