Я пытаюсь настроить проект LWJGL с использованием Maven. Я использую пример «начального» исходного кода от the official website.Maven не включает атрибуты манифеста для установки LWJGL
Это включает в себя несколько строк с доступом манифеста атрибуты LWJGL, такие, как простая проверка версии:
System.out.println("Hello LWJGL " + Version.getVersion() + "!");
Это работает без каких-либо проблем в среде Eclipse (конечно же после того, как построил проект с Maven), но при запуске clean install
и затем запустить **-jar-with-dependencies.jar
через ЦМД следующее исключение получить бросил:
java.lang.NullPointerException
at org.lwjgl.system.APIUtil.apiGetManifestValue(APIUtil.java:97)
at org.lwjgl.Version.getVersion(Version.java:33)
at HelloWorld.run(HelloWorld.java:43)
at HelloWorld.main(HelloWorld.java:130)
Это происходит потому, Manifest
объект, созданный APIUtil
не содержит никаких атрибутов - , но только во встроенной версии Maven.
Почему это? Является ли мой pom.xml багги, или LWJGL 3.0.0 просто не готов к этому?
Это мой pom.xml
:
<properties>
<mainClass>HelloWorld</mainClass>
<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
<finalName>${project.artifactId}-${project.version}.jar</finalName>
</properties>
<dependencies>
<dependency>
<groupId>org.lwjgl</groupId>
<artifactId>lwjgl</artifactId>
<version>3.0.0</version>
</dependency>
<dependency>
<groupId>org.lwjgl</groupId>
<artifactId>lwjgl-platform</artifactId>
<version>3.0.0</version>
<classifier>natives-windows</classifier>
</dependency>
<dependency>
<groupId>org.lwjgl</groupId>
<artifactId>lwjgl-platform</artifactId>
<version>3.0.0</version>
<classifier>natives-linux</classifier>
</dependency>
<dependency>
<groupId>org.lwjgl</groupId>
<artifactId>lwjgl-platform</artifactId>
<version>3.0.0</version>
<classifier>natives-osx</classifier>
</dependency>
</dependencies>
<build>
<plugins>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-compiler-plugin</artifactId>
<version>3.5.1</version>
<configuration>
<source>1.8</source>
<target>1.8</target>
</configuration>
</plugin>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-assembly-plugin</artifactId>
<executions>
<execution>
<phase>package</phase>
<goals>
<goal>single</goal>
</goals>
</execution>
</executions>
<configuration>
<descriptorRefs>
<descriptorRef>jar-with-dependencies</descriptorRef>
</descriptorRefs>
<archive>
<manifest>
<mainClass>${mainClass}</mainClass>
</manifest>
</archive>
</configuration>
</plugin>
</plugins>
</build>
Отличный ответ, очень ясно. Мне не нравится второй вариант, так как это затрудняет выполнение пользователем программы. Есть ли возможность включить банки в основную банку? Будет ли это работать? Кроме того, просто игнорирование этого также не является вариантом, так как LWJGL вызывает эти методы в любом случае в статических блоках, когда инициализируются определенные классы (например, Libary calls checkHash(), который сравнивает фактический хэш хэда с значением, хранящимся в манифесте). – Frithjof
@Frithjof Нет, в том числе библиотеки, банки внутри основной банки не будут работать. Банки будут рассматриваться как ресурсы, а классы, которые они содержат, не будут находиться в пути к классам (см. Http://stackoverflow.com/q/183292). Во втором варианте это так же просто, как и первое: вам нужно распаковать ZIP и запустить ту же команду, что и раньше. Если проблема состоит в том, что есть много банок (так что это запутывает, какой из них запускать), вы можете добавить скрипт оболочки ('start.bat' /' start.sh') в корень ZIP и выполнить эту оболочку вместо скрипта. (Очень похоже на то, что сам дистрибутив Maven поставляется в комплекте.) – Tunaki
@Frithjof Еще одно решение - иметь основной артефакт не внутри папки 'lib', а вне его, в корне ZIP. Затем вы можете запустить 'java -jar finalName.jar' и не нужно беспокоиться о том, что находится внутри' lib'. Необходимые изменения: 1. ' false useProjectArtifact>' (вместо 'true') в дескрипторе сборки 2. Добавить в дескриптор' / outputDirectory> 'для копирования основного JAR и 3. Добавьте' lib classpathPrefix> 'в конфигурацию Jar Plugin. –
Tunaki