Создание многоплатформенного исполняемого файла для приложения SWT (Eclipse)
У меня есть приложение SWT на основе Eclipse, не использующее Maven.
Мое приложение предназначено для нескольких операционных систем (CentOS, Windows и Mac).
Единственный файл jar, который не зависит от ОС, - это библиотека SWT, которая специфична для каждого типа ОС, не говоря уже о типе процессора (x86 и / или x64).
Я видел эту другую проблему, но она нацелена на Maven, и я не использую Maven.
Я добавил org.eclipse.swt в свой проект, выполнив описанную процедуру и включив весь загруженный SWT-файл ZIP. Это указывает на второй проект в Package Explorer.
Раньше, когда я просто включал swt.jar, это было немного проще, так как мне просто нужно было удалить банку, включить новую и восстановить, но это было проблемой. Теперь, когда я использую весь SWT ZIP, процесс немного утомительный и не профессиональный.
Каковы действия, чтобы при указании "правой кнопкой мыши> Java > Runnable JAR-файл" создать один исполняемый jar-файл, в котором я получу 3 (или сколько угодно) различных jar-файлов, по одному на каждую операционную систему? Visual Studio делает это красиво, просто я не знаю, как это сделать здесь, в Eclipse.
ОБНОВЛЕНИЕ: Чтобы ответить на комментарий, я хотел добавить поддержку JFace, так как я хочу использовать функцию TableViewer, которая требует JFace. В Eclipse на этой странице в первой части рассказывается, как добавить SWT. Шаги работают за исключением добавления исходного кода в конце, но это не по теме.
Я следовал инструкциям для 64-битной Windows, однако я должен поддерживать CENTOS, и Mac был бы "хорош" в данный момент.
Независимо от стихов swt.jar org.eclipse.swt, я хотел бы использовать чистый способ (например, Visual Studio с.Net) для создания одного исполняемого / исполняемого файла JAR для моего приложения, по одному для каждого поддерживаемого типа ОС. Моя мысль заключается в том, что я указываю сборку (независимо от последовательности клавиш меню после того, как я ее настрою) и получаю один исполняемый файл jar на целевую ОС.
1 ответ
Да, несмотря на то, что я говорю, что вы можете создать один .jar
файл для всех платформ, я не смог заставить его работать должным образом.
Тем не менее, мне удалось запустить пример проекта, который создаст отдельный .jar
файл для каждой платформы для вас, просто используя Ant.
Вы можете скачать весь проект здесь.
Сценарий сборки выглядит следующим образом:
<project name="RandomApp" basedir="." default="clean-build">
<property name="src.dir" value="src" />
<!-- Define the necessary paths -->
<property name="build.dir" value="bin_temp" />
<property name="lib.dir" value="lib" />
<property name="lib.deploy.dir" value="lib_swt" />
<property name="classes.dir" value="${build.dir}/classes" />
<property name="jar.dir" value="${build.dir}/jar" />
<!-- Define the main class -->
<property name="main-class" value="org.baz.desktop.randomapp.RandomApp" />
<!-- Define the class path -->
<path id="classpath">
<fileset dir="${lib.dir}" includes="**/*.jar" />
<fileset dir="${lib.deploy.dir}" includes="**/swt_linux_gtk_x86.jar" />
</path>
<!-- Clean previously built files -->
<target name="clean">
<delete dir="${build.dir}" />
</target>
<!-- Compile the project -->
<target name="compile">
<mkdir dir="${classes.dir}" />
<javac srcdir="${src.dir}" destdir="${classes.dir}" classpathref="classpath" includeantruntime="false" />
</target>
<!-- Define classpath and create the jar folder -->
<target name="pre_jar" depends="compile">
<pathconvert property="manifest.classpath" pathsep=" ">
<path refid="classpath" />
<mapper>
<chainedmapper>
<flattenmapper />
<globmapper from="*.jar" to="*.jar" />
</chainedmapper>
</mapper>
</pathconvert>
<mkdir dir="${jar.dir}" />
</target>
<!-- Create the jar files -->
<target name="jar" depends="pre_jar">
<!-- Linux 32bit -->
<jar destfile="${jar.dir}/${ant.project.name}_linux_gtk_x86.jar" basedir="${classes.dir}">
<manifest>
<attribute name="Main-Class" value="org.eclipse.jdt.internal.jarinjarloader.JarRsrcLoader" />
<attribute name="Rsrc-Main-Class" value="${main-class}" />
<attribute name="Class-Path" value="." />
<attribute name="Rsrc-Class-Path" value="./ ${manifest.classpath}" />
</manifest>
<zipgroupfileset dir="${lib.dir}" includes="**/jar-in-jar-loader.jar" />
<zipfileset dir="${lib.deploy.dir}" includes="**/swt_linux_gtk_x86.jar" />
<zipfileset dir="${lib.dir}" includes="**/*.jar" excludes="**/jar-in-jar-loader.jar" />
</jar>
<!-- Linux 64bit -->
<jar destfile="${jar.dir}/${ant.project.name}_linux_gtk_x64.jar" basedir="${classes.dir}">
<manifest>
<attribute name="Main-Class" value="org.eclipse.jdt.internal.jarinjarloader.JarRsrcLoader" />
<attribute name="Rsrc-Main-Class" value="${main-class}" />
<attribute name="Class-Path" value="." />
<attribute name="Rsrc-Class-Path" value="./ ${manifest.classpath}" />
</manifest>
<zipgroupfileset dir="${lib.dir}" includes="**/jar-in-jar-loader.jar" />
<zipfileset dir="${lib.deploy.dir}" includes="**/swt_linux_gtk_x64.jar" />
<zipfileset dir="${lib.dir}" includes="**/*.jar" excludes="**/jar-in-jar-loader.jar" />
</jar>
<!-- Windows 32bit -->
<jar destfile="${jar.dir}/${ant.project.name}_win32_x86.jar" basedir="${classes.dir}">
<manifest>
<attribute name="Main-Class" value="org.eclipse.jdt.internal.jarinjarloader.JarRsrcLoader" />
<attribute name="Rsrc-Main-Class" value="${main-class}" />
<attribute name="Class-Path" value="." />
<attribute name="Rsrc-Class-Path" value="./ ${manifest.classpath}" />
</manifest>
<zipgroupfileset dir="${lib.dir}" includes="**/jar-in-jar-loader.jar" />
<zipfileset dir="${lib.deploy.dir}" includes="**/swt_win32_x86.jar" />
<zipfileset dir="${lib.dir}" includes="**/*.jar" excludes="**/jar-in-jar-loader.jar" />
</jar>
<!-- Windows 64bit -->
<jar destfile="${jar.dir}/${ant.project.name}_win32_x64.jar" basedir="${classes.dir}">
<manifest>
<attribute name="Main-Class" value="org.eclipse.jdt.internal.jarinjarloader.JarRsrcLoader" />
<attribute name="Rsrc-Main-Class" value="${main-class}" />
<attribute name="Class-Path" value="." />
<attribute name="Rsrc-Class-Path" value="./ ${manifest.classpath}" />
</manifest>
<zipgroupfileset dir="${lib.dir}" includes="**/jar-in-jar-loader.jar" />
<zipfileset dir="${lib.deploy.dir}" includes="**/swt_win32_x64.jar" />
<zipfileset dir="${lib.dir}" includes="**/*.jar" excludes="**/jar-in-jar-loader.jar" />
</jar>
<!-- MacOS 32bit -->
<jar destfile="${jar.dir}/${ant.project.name}_macos_x86.jar" basedir="${classes.dir}">
<manifest>
<attribute name="Main-Class" value="org.eclipse.jdt.internal.jarinjarloader.JarRsrcLoader" />
<attribute name="Rsrc-Main-Class" value="${main-class}" />
<attribute name="Class-Path" value="." />
<attribute name="Rsrc-Class-Path" value="./ ${manifest.classpath}" />
</manifest>
<zipgroupfileset dir="${lib.dir}" includes="**/jar-in-jar-loader.jar" />
<zipfileset dir="${lib.deploy.dir}" includes="**/swt_macosx_x86.jar" />
<zipfileset dir="${lib.dir}" includes="**/*.jar" excludes="**/jar-in-jar-loader.jar" />
</jar>
<!-- MacOS 64bit -->
<jar destfile="${jar.dir}/${ant.project.name}_macos_x64.jar" basedir="${classes.dir}">
<manifest>
<attribute name="Main-Class" value="org.eclipse.jdt.internal.jarinjarloader.JarRsrcLoader" />
<attribute name="Rsrc-Main-Class" value="${main-class}" />
<attribute name="Class-Path" value="." />
<attribute name="Rsrc-Class-Path" value="./ ${manifest.classpath}" />
</manifest>
<zipgroupfileset dir="${lib.dir}" includes="**/jar-in-jar-loader.jar" />
<zipfileset dir="${lib.deploy.dir}" includes="**/swt_macosx_x64.jar" />
<zipfileset dir="${lib.dir}" includes="**/*.jar" excludes="**/jar-in-jar-loader.jar" />
</jar>
</target>
<target name="clean-build" depends="clean,jar" />
</project>
Сам проект ничего особенного, просто JFace Dialog
чтобы показать, что JFace работает так же хорошо.
ПРИМЕЧАНИЕ:
Чтобы сделать эту компиляцию на машине с Windows, вам нужно изменить одну строку:
<fileset dir="${lib.deploy.dir}" includes="**/swt_linux_gtk_x86.jar" />
измените это на:
<fileset dir="${lib.deploy.dir}" includes="**/swt_win32_x64.jar" />
или же
<fileset dir="${lib.deploy.dir}" includes="**/swt_win32_x86.jar" />
По сути, эта строка должна представлять ВАШУ систему, т. Е. Систему, на которой вы компилируете.