Does flyway support conditional execution of a script, per environment?
For example, if I have test data, can I create a test data script folder thats only loaded if the env is configured as test?
For future visitors, this is a solution for DB specific sql, but applies to data loading too. https://flywaydb.org/documentation/faq#db-specific-sql
You can set the flyway.locations=sql/common,sql/data property, and this can be set to different values with spring profiles(dev/test/prod), omitting the sql/data scripts on production.
Maven profiles did not give me the flexibility I wanted. I came up with a strategy that uses ant to merge files. This allows me to have common scripts and then included additional data depending on the deploy type eg. prod, dev.
This is my project structure:
├── build.xml
├── database.properties
├── database.properties.template
├── lib
│ └── ant-contrib-1.0b3.jar
├── pom.xml
└── sql
├── common
│ ├── V1.0__.sql
│ ├── V1.2.1__.sql
│ └── V1.3__.sql
├── dev
│ ├── V1.0__.sql
│ └── V1.3__.sql
└── prod
└── V1.0__.sql
database.properties.template file in the root folder, before running this has to manually be copied to database.properties and the username and password can be entered. database.properties should be ignored by VCS so that passwords don't end up in the repo.
deployType scripts are merged into the src/main/resources/db/migrate directory, here is the ant script that does that, note that scripts that are to be merged have the same name:
<project name="data" default="prepareSql">
<property file="database.properties" />
<property name="destDir" value="src/main/resources/db/migration" />
<echo message="Deploy type: ${deployType}"/>
<taskdef resource="net/sf/antcontrib/antcontrib.properties">
<classpath>
<pathelement location="lib/ant-contrib-1.0b3.jar"/>
</classpath>
</taskdef>
<target name="prepareSql">
<!-- ensure the dest dir exists -->
<mkdir dir="${destDir}"/>
<!-- clear out the dest dir -->
<delete>
<fileset dir="${destDir}">
<include name="*" />
</fileset>
</delete>
<!-- append the deploy type files to the common files, delegate to the append target -->
<foreach target="append" param="file">
<fileset dir="sql/common" casesensitive="yes">
<include name="*" />
</fileset>
</foreach>
</target>
<target name="append">
<basename property="basename" file="${file}" />
<property name="destFile" value="${destDir}/${basename}"/>
<echo message="Appending ${file} to ${destFile}" />
<concat destfile="${destFile}" >
<filelist dir="sql/common" files="${basename}" />
<filelist dir="sql/${deployType}" files="${basename}" />
</concat>
</target>
</project>
This ant file is executed by maven, here is the pom config:
<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/maven-v4_0_0.xsd">
<modelVersion>4.0.0</modelVersion>
<groupId>data</groupId>
<artifactId>data</artifactId>
<version>1.1-SNAPSHOT</version>
<packaging>pom</packaging>
<name>data</name>
<properties>
<sqlBaseDir>filesystem:${basedir}/src/main/resources/</sqlBaseDir>
</properties>
<build>
<plugins>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-antrun-plugin</artifactId>
<version>1.7</version>
<executions>
<execution>
<id>mergeScripts</id>
<phase>validate</phase>
<inherited>false</inherited>
<configuration>
<target>
<ant antfile="build.xml" target="prepareSql" />
</target>
</configuration>
<goals>
<goal>run</goal>
</goals>
</execution>
</executions>
</plugin>
<plugin>
<groupId>org.flywaydb</groupId>
<artifactId>flyway-maven-plugin</artifactId>
<version>3.2.1</version>
<configuration>
<schemas>
<schema>common</schema>
</schemas>
<configFile>database.properties</configFile>
<table>flyway</table>
<locations>
<location>filesystem:${basedir}/src/main/resources/db/migration</location>
</locations>
</configuration>
</plugin>
</plugins>
</build>
<dependencies>
<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
<version>5.1.36</version>
</dependency>
</dependencies>
</project>
Should you require different data for different client distributions you could add dist directories into the sql directory and they could contain deployType sub directories.
Add the dist property to the database.properties.template file and then modify the append target in the build.xml to look like this:
<target name="append">
<basename property="basename" file="${file}" />
<property name="destFile" value="${destDir}/${basename}"/>
<echo message="Appending ${file} to ${destFile}" />
<concat destfile="${destFile}" >
<filelist dir="sql/common" files="${basename}" />
<filelist dir="sql/${deployType}" files="${basename}" />
<filelist dir="sql/${dist}/common" files="${basename}" />
<filelist dir="sql/${dist}/${deployType}" files="${basename}" />
</concat>
</target>
If you are using maven, you can able to achieve it very easily through maven profiles concept. Please refer the following sample
pom.xml
<plugin>
<groupId>com.googlecode.flyway</groupId>
<artifactId>flyway-maven-plugin</artifactId>
<version>2.3</version>
<configuration>
<url>jdbc:sqlserver://${db.hostname};databaseName=${db.name}</url>
<user>${db.username}</user>
<password>${db.password}</password>
<initVersion>0</initVersion>
<initDescription>Base Migration</initDescription>
<table>Changelog_testproject</table>
<locations>
<location>filesystem:${sql.file.path}</location>
</locations>
</configuration>
</plugin>
<profiles>
<profile>
<id>dev</id>
<properties>
<profile.name>dev</profile.name>
<sql.file.path>${basedir}/deploy/dev/sqldelta/sqlserver</sql.file.path>
<db.hostname>127.0.0.1:1433</db.hostname>
<db.name>dev</db.name>
<db.username>dev</db.username>
<db.password>devadmin</db.password>
</properties>
</profile>
<profile>
<id>test</id>
<properties>
<profile.name>test</profile.name>
<sql.file.path>${basedir}/deploy/test/sqldelta/sqlserver</sql.file.path>
<db.hostname>127.0.0.1:1433</db.hostname>
<db.name>test</db.name>
<db.username>test</db.username>
<db.password>testadmin</db.password>
</properties>
</profile>
</profiles>
flyway flywaydb
You can use flyway placeholder:
Configure it on your enviroment config.properties:
flyway.placeholders.tableName=MY_TABLE
flyway.placeholders.name='Mr. Test'
Then, put it on your script:
INSERT INTO ${tableName} (name) VALUES (${name});
I have used the flyway.locations too, but the placeholders is simpler than locations for simple changes.
You can now use this feature to switch on environment by adding a .conf file beside the migration you only want to run on test environment.
V1_test_createTable.sql <- your script
V1_test_createTable.sql.conf <- contains just the line shouldExecute=${environment}==test
https://flywaydb.org/documentation/tutorials/injectingEnvironments
Related
I've downloaded netbeans 11 with support for java 12
So I followed up the steps from the Gluon webpage running JavaFX and Netbeans Non modular with maven > https://openjfx.io/openjfx-docs/#next-steps
I have configured as showed in the instructions the action to run this app.
Run Project
clean javafx:run
But there is nothing specified to debug the project.
Is there a way to debug this javaFX project?
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/maven-v4_0_0.xsd">
<modelVersion>4.0.0</modelVersion>
<groupId>com.mycompany</groupId>
<artifactId>SimonSaysGFX</artifactId>
<version>1.0.0-SNAPSHOT</version>
<properties>
<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
<maven.compiler.source>12</maven.compiler.source>
<maven.compiler.target>12</maven.compiler.target>
</properties>
<dependencies>
<dependency>
<groupId>org.openjfx</groupId>
<artifactId>javafx-controls</artifactId>
<version>12.0.1</version>
</dependency>
<dependency>
<groupId>org.openjfx</groupId>
<artifactId>javafx-media</artifactId>
<version>12.0.1</version>
</dependency>
<dependency>
<groupId>org.openjfx</groupId>
<artifactId>javafx-fxml</artifactId>
<version>12.0.1</version>
</dependency>
</dependencies>
<build>
<plugins>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-compiler-plugin</artifactId>
<version>3.8.0</version>
<configuration>
<release>12</release>
</configuration>
</plugin>
<plugin>
<groupId>org.openjfx</groupId>
<artifactId>javafx-maven-plugin</artifactId>
<version>0.0.2</version>
<configuration>
<mainClass>com.mycompany.simonsaysgfx.App</mainClass>
</configuration>
</plugin>
</plugins>
</build>
<name>SimonSaysGFX</name>
</project>
If you see the documentation of the javafx-maven-plugin, you can add some VM arguments to the run goal in order to debug your project in NetBeans.
However, to keep the usual run goal ready to just run the project and not debug, without commenting out the added options, we can add a second execution to the plugin.
Modify your plugin like this:
<plugin>
<groupId>org.openjfx</groupId>
<artifactId>javafx-maven-plugin</artifactId>
<version>0.0.2</version>
<executions>
<execution>
<!-- Default configuration for running -->
<id>default-cli</id>
<configuration>
<mainClass>com.mycompany.simonsaysgfx.App</mainClass>
</configuration>
</execution>
<execution>
<!-- Configuration for debugging -->
<id>debug</id>
<configuration>
<options>
<option>-agentlib:jdwp=transport=dt_socket,server=y,suspend=y,address=*:8000</option>
</options>
<mainClass>com.mycompany.simonsaysgfx.App</mainClass>
</configuration>
</execution>
</executions>
</plugin>
Now you can run from command line:
mvn clean javafx:run
to run as usual your application, and:
mvn clean javafx:run#debug
to start debug mode. Then you will see something like:
[INFO] --- javafx-maven-plugin:0.0.2:run (debug) # Project ---
[INFO] Using 'UTF-8' encoding to copy filtered resources.
[INFO] Copying 1 resource
[INFO] Changes detected - recompiling the module!
[INFO] Compiling 3 source files to /path/to/project/target/classes
Listening for transport dt_socket at address: 8000
At this point, you need to set your breakpoints and attach a debugger from NetBeans -> Debug -> Attach Debugger to port 8000:
Click OK and you will be able to debug your projects.
Note that you can also define custom NetBeans actions to use the Run and Debug buttons. Add a nbactions.xml file to the root of your project, with this two actions:
<?xml version="1.0" encoding="UTF-8"?>
<actions>
<action>
<actionName>run</actionName>
<goals>
<goal>clean</goal>
<goal>javafx:run</goal>
</goals>
</action>
<action>
<actionName>jlink</actionName>
<goals>
<goal>clean</goal>
<goal>javafx:jlink</goal>
</goals>
</action>
<action>
<actionName>debug</actionName>
<goals>
<goal>clean</goal>
<goal>javafx:run#debug</goal>
</goals>
</action>
</actions>
Now you can use NetBeans run and debug buttons.
José's answer is good. Just go little bit further.
In pom.xml set the
address=${jpda.address} instead of address=*:8000
<execution>
<!-- Configuration for debugging -->
<id>debug</id>
<configuration>
<options>
<option>-agentlib:jdwp=transport=dt_socket,server=n,address=${jpda.address}</option>
</options>
<mainClass>cz.masci.mvcpattern.mvc.App</mainClass>
</configuration>
</execution>
Be aware of set server=n, otherwise the application will not start.
In the debug action set jpda.listen=true property
...
<action>
<actionName>debug</actionName>
<goals>
<goal>clean</goal>
<goal>javafx:run#debug</goal>
</goals>
<properties>
<jpda.listen>true</jpda.listen>
</properties>
</action>
Then you don't need to attach debuger anymore. Netbeans does it for you.
this is my Jboss-Deployment-Structure.xml file:
<jboss-deployment-structure xmlns="urn:jboss:deployment-structure:1.2">
<ear-subdeployments-isolated>false</ear-subdeployments-isolated>
<deployment>
<exclude-subsystems>
<subsystem name="jaxrs" />
</exclude-subsystems>
<dependencies>
<!-- add our own modules -->
<module name="org.jboss.remoting3" />
<module name="deployment.ARXSecurityAPIToolkit.ear" export="true" />
<module name="df.properties" />
</dependencies>
<exclusions>
<!-- Exclude org.jboss.remoting3, we added custom module -->
<module name="org.jboss.remoting3" />
</exclusions>
</deployment>
</jboss-deployment-structure>
Dependency deployment.ARXSecurityAPIToolkit.ear has several jars inside of it.
When creating a dependency, I want all jars in it except one(ARX.jar) to be a part of the dependency. How to exclude a particular jar(ARX.jar) from my ear in the dependency section.
I've been fighting with this for over a day and have read many posts on SO and other places, but I'm still having problems.
I need to include my application icon in a self-contained JavaFX application package. I'm using JDK 1.8.0_45 and its included JavaFX package. I'm using Maven to build the .exe and it all works great except I can't get my icon included.
Here is my pom.xml:
<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
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>
<prerequisites>
<maven>2.2.1</maven>
</prerequisites>
<groupId>com.mycompany.drm</groupId>
<artifactId>DRMDashboard</artifactId>
<version>2.0</version>
<properties>
<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
<javafx.version>8.0.45</javafx.version>
</properties>
<build>
<plugins>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-compiler-plugin</artifactId>
<version>3.3</version>
<configuration>
<source>1.8</source>
<target>1.8</target>
</configuration>
</plugin>
<plugin>
<!-- copy all dependencies of your app to target folder-->
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-dependency-plugin</artifactId>
<version>2.10</version>
<executions>
<execution>
<id>copy-dependencies</id>
<phase>package</phase>
<configuration>
<overWriteReleases>false</overWriteReleases>
<overWriteSnapshots>false</overWriteSnapshots>
<overWriteIfNewer>true</overWriteIfNewer>
</configuration>
<goals>
<goal>copy-dependencies</goal>
</goals>
</execution>
</executions>
</plugin>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-jar-plugin</artifactId>
<version>2.6</version>
<configuration>
<archive>
<manifestEntries>
<JavaFX-Version>${javafx.version}+</JavaFX-Version>
<Main-Class>com.mycompany.client.HelloWorld</Main-Class>
<implementation-version>2.0</implementation-version>
<JavaFX-Application-Class>com.mycompany.client.HelloWorld</JavaFX-Application-Class>
<JavaFX-Class-Path>
<!-- list all your dependencies here-->
</JavaFX-Class-Path>
<!-- The artifactId (name) of the jfxrt.jar ... see dependency system scope-->
<Class-Path>
javafx-${javafx.version}.jar
</Class-Path>
</manifestEntries>
<manifest>
<addClasspath>true</addClasspath>
</manifest>
</archive>
</configuration>
</plugin>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-antrun-plugin</artifactId>
<version>1.6</version>
<executions>
<execution>
<phase>package</phase>
<configuration>
<target>
<path id="mypath">
<pathelement path="${maven.plugin.classpath}"/>
<fileset dir="${project.basedir}">
<include name="package/windows/DRMDashboard.ico"/>
</fileset>
</path>
<!-- define the deploy ANT task-->
<taskdef name="jfxdeploy" classname="com.sun.javafx.tools.ant.DeployFXTask"
classpathref="mypath" />
<!-- define the JarSign ANT task-->
<taskdef name="jfxsignjar" classname="com.sun.javafx.tools.ant.FXSignJarTask"
classpathref="maven.plugin.classpath" />
<jfxdeploy outdir="${project.build.directory}/deploy"
outfile="DRMDashboard"
nativeBundles="exe"
verbose="true">
<info title="DRM Dashboard" vendor="My Company, Inc."/>
<application name="DRMDashboard" mainClass="com.mycompany.client.HelloWorld" version="2.0" />
<resources>
<fileset dir="${project.build.directory}" includes="*.jar" />
<!--includes="*.jar" />-->
</resources>
<!-- set your jvm args-->
<platform javafx="${javafx.version}+">
<jvmarg value="-Xms512m" />
<jvmarg value="-Xmx1024m" />
</platform>
<preferences install="false" menu="true" shortcut="true"/>
</jfxdeploy>
<!-- you need to generate a key yourself -->
<jfxsignjar destdir="${project.build.directory}/deploy"
keyStore="c:/Users/me/DRMDashboard.ks" storePass="****" alias="DRMDashboard"
keyPass="****">
<fileset dir="${project.build.directory}/deploy"
includes="*.jar" />
</jfxsignjar>
</target>
</configuration>
<goals>
<goal>run</goal>
</goals>
</execution>
</executions>
<dependencies>
<dependency>
<groupId>com.oracle</groupId>
<artifactId>ant-javafx</artifactId>
<version>${javafx.version}</version>
<systemPath>${java.home}/../lib/ant-javafx.jar</systemPath>
<scope>system</scope>
</dependency>
</dependencies>
</plugin>
</plugins>
<finalName>DRMDashboard</finalName>
</build>
</project>
EDIT 1: Here's a screenshot of my file explorer:
EDIT 2: Here's a screenshot of the expanded target folder:
When I execute the build with the verbose flag, I get these messages:
main:
No base JDK. Package will use system JRE.
Using default package resource [application icon] (add package/windows/DRMDashboard.ico to the class path to customize)
Icon File Name: C:\Users\jernst\AppData\Local\Temp\fxbundler8622978628378929412\windows\DRMDashboard.ico
Executable File Name: C:\Users\jernst\AppData\Local\Temp\fxbundler8622978628378929412\images\win-exe.image\DRMDashboard\DRMDashboard.exe
Config files are saved to C:\Users\jernst\AppData\Local\Temp\fxbundler8622978628378929412\windows. Use them to customize package.
Using default package resource [Inno Setup project file] (add package/windows/DRMDashboard.iss to the class path to customize)
Using default package resource [setup dialog icon] (add package/windows/DRMDashboard-setup-icon.bmp to the class path to customize)
Using default package resource [script to run after application image is populated] (add package/windows/DRMDashboard-post-image.wsf to the class path to customize)
I've tried using the "Drop In Resources" as described in the Oracle Documentation, but no matter what I try to get the classpath right, it won't recognize my custom icon
EDIT 3:
I used NwDx's suggested approach of using the javapackager instead of the ant task and I've gotten very close to what I need. Now my only problem is that the dialog box icon still uses the generic java coffee cup:
Here's my current POM:
<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
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>
<prerequisites>
<maven>2.2.1</maven>
</prerequisites>
<groupId>com.autoap.drm</groupId>
<artifactId>native_drm</artifactId>
<version>2.0</version>
<properties>
<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
<javafx.version>8.0.45</javafx.version>
<mainClass>com.autoap.client.DRMDashboard</mainClass>
<application.title>DRMDashboard</application.title>
<organization.name>AutoAp, Inc.</organization.name>
</properties>
<build>
<plugins>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-compiler-plugin</artifactId>
<version>3.3</version>
<configuration>
<source>1.8</source>
<target>1.8</target>
</configuration>
</plugin>
<plugin>
<!-- copy all dependencies of your app to target folder-->
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-dependency-plugin</artifactId>
<version>2.10</version>
<executions>
<execution>
<id>copy-dependencies</id>
<phase>package</phase>
<configuration>
<overWriteReleases>false</overWriteReleases>
<overWriteSnapshots>false</overWriteSnapshots>
<overWriteIfNewer>true</overWriteIfNewer>
</configuration>
<goals>
<goal>copy-dependencies</goal>
</goals>
</execution>
</executions>
</plugin>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-jar-plugin</artifactId>
<version>2.6</version>
<configuration>
<archive>
<manifestEntries>
<JavaFX-Version>${javafx.version}+</JavaFX-Version>
<Main-Class>com.autoap.client.DRMDashboard</Main-Class>
<implementation-version>2.0</implementation-version>
<JavaFX-Application-Class>com.autoap.client.DRMDashboard</JavaFX-Application-Class>
<JavaFX-Class-Path>
<!-- list all your dependencies here-->
</JavaFX-Class-Path>
<!-- The artifactId (name) of the jfxrt.jar ... see dependency system scope-->
<Class-Path>
javafx-${javafx.version}.jar
</Class-Path>
</manifestEntries>
<manifest>
<addClasspath>true</addClasspath>
</manifest>
</archive>
</configuration>
</plugin>
<plugin>
<groupId>org.codehaus.mojo</groupId>
<artifactId>exec-maven-plugin</artifactId>
<version>1.4.0</version>
<executions>
<!-- Create the jar file -->
<execution>
<id>createjar</id>
<phase>package</phase>
<goals>
<goal>exec</goal>
</goals>
<configuration>
<executable>${java.home}/../bin/javapackager</executable>
<arguments>
<argument>-createjar</argument>
<argument>-nocss2bin</argument>
<argument>-appclass</argument>
<argument>${mainClass}</argument>
<argument>-srcdir</argument>
<argument>${project.build.directory}/classes</argument>
<argument>-outdir</argument>
<argument>${project.build.directory}</argument>
<argument>-outfile</argument>
<argument>${project.build.finalName}.jar</argument>
</arguments>
</configuration>
</execution>
<!-- Sign the jar -->
<!-- Can't test, because I don't have the files
<execution>
<id>signjar</id>
<phase>package</phase>
<goals>
<goal>exec</goal>
</goals>
<configuration>
<executable>${java.home}/../bin/javapackager</executable>
<arguments>
<argument>-signjar</argument>
<argument>-alias</argument>
<argument>${application.title}</argument>
<argument>-keyPass</argument>
<argument>****</argument>
<argument>-keyStore</argument>
<argument>C:/Users/me/DRMDashboard.ks</argument>
<argument>-storePass</argument>
<argument>*****</argument>
<argument>-outdir</argument>
<argument>${project.build.directory}</argument>
<argument>-srcdir</argument>
<argument>${project.build.directory}</argument>
<argument>-srcfiles</argument>
<argument>${project.build.finalName}.jar</argument>
</arguments>
</configuration>
</execution> -->
<!-- Deploy a native version -->
<execution>
<id>deploy</id>
<phase>package</phase>
<goals>
<goal>exec</goal>
</goals>
<configuration>
<executable>${java.home}/../bin/javapackager</executable>
<arguments>
<argument>-deploy</argument>
<argument>-appclass</argument>
<argument>${mainClass}</argument>
<argument>-native</argument>
<argument>exe</argument>
<argument>-srcdir</argument>
<argument>${project.build.directory}</argument>
<argument>-srcfiles</argument>
<argument>${project.build.finalName}.jar</argument>
<argument>-outdir</argument>
<argument>${project.build.directory}/dist</argument>
<argument>-outfile</argument>
<argument>${project.build.finalName}</argument>
<argument>-Bicon=${project.build.directory}/classes/${application.title}.ico</argument>
<argument>-BappVersion=${project.version}</argument>
<argument>-Bcopyright='2015 AutoAp, Inc.'</argument>
<argument>-BshortcutHint=true</argument>
<argument>-BsystemWide=false</argument>
<argument>-Bwin.menuGroup=${organization.name}</argument>
<argument>-Bvendor=${organization.name}</argument>
<argument>-v</argument>
</arguments>
</configuration>
</execution>
<execution>
<id>default-cli</id>
<goals>
<goal>exec</goal>
</goals>
<configuration>
<executable>${java.home}/bin/java</executable>
<commandlineArgs>-jar '${project.build.directory}/${project.build.finalName}.jar'</commandlineArgs>
</configuration>
</execution>
</executions>
</plugin>
</plugins>
<finalName>DRMDashboard</finalName>
</build>
</project>
The thing that made the icon show up in the title bar is the -Bicon=${project.build.directory}/classes/${application.title}.ico argument to the javapackager deploy step. That line tells the inno installer to use the icon. The last piece of the puzzle is how to make inno use the bmp for the dialog box image. Here's the relevant bit of the log file:
Running [C:\Program Files\Java\jdk1.8.0_45\jre\bin\java, -version]
Running [C:\Program Files (x86)\Inno Setup 5\iscc.exe, /?]
Detected [C:\Program Files (x86)\Inno Setup 5\iscc.exe] version [5]
Using custom package resource [application icon] (loaded from file C:\Users\jernst\IdeaProjects\AutoAp\native_drm\target\classes\DRMDashboard.ico)
Running [C:\Users\jernst\AppData\Local\Temp\iconswap106251599206027586.exe, C:\Users\jernst\AppData\Local\Temp\fxbundler6949394438624826643\windows\DRMDashboard.ico, C:\Users\jernst\AppData\Local\Temp\fxbundler6949394438624826643\images\win-exe.image\DRMDashboard\DRMDashboard.exe]
Icon File Name: C:\Users\jernst\AppData\Local\Temp\fxbundler6949394438624826643\windows\DRMDashboard.ico
Executable File Name: C:\Users\jernst\AppData\Local\Temp\fxbundler6949394438624826643\images\win-exe.image\DRMDashboard\DRMDashboard.exe
Config files are saved to C:\Users\jernst\AppData\Local\Temp\fxbundler6949394438624826643\windows. Use them to customize package.
Using default package resource [Inno Setup project file] (add package/windows/DRMDashboard.iss to the class path to customize)
Using default package resource [setup dialog icon] (add package/windows/DRMDashboard-setup-icon.bmp to the class path to customize)
Using default package resource [script to run after application image is populated] (add package/windows/DRMDashboard-post-image.wsf to the class path to customize)
Generating EXE for installer to: C:\Users\jernst\IdeaProjects\AutoAp\native_drm\target\dist\bundles
Running [C:\Program Files (x86)\Inno Setup 5\iscc.exe, /oC:\Users\jernst\IdeaProjects\AutoAp\native_drm\target\dist\bundles, C:\Users\jernst\AppData\Local\Temp\fxbundler6949394438624826643\images\win-exe.image\DRMDashboard.iss] in C:\Users\jernst\AppData\Local\Temp\fxbundler6949394438624826643\images\win-exe.image
Inno Setup 5 Command-Line Compiler
You can see where it finds my custom application icon, but it's not finding the custom setup dialog icon.
Prerequirements / Assumptions
You're on Windows (7, 8, 8.1)
You have a JDK installed at least in version 1.8.0 (javafx included)
You've set the JAVA_HOME environment variable pointing to the top directory of your JDK (ex. C:\Program Files\Java\jdk1.8.0_45)
You have Inno Setup at least in version 5.5.5 installed (prefered the unicode version)
You already have a icon file (256 x 256px), prefered a multisize one. I recommend to visit this site: http://icoconvert.com/
You already have a bmp file (48 x 48 px) for the setup installer as setup icon
Solution
Project structure
First you need to setup the Project in a valid structure, like this:
Your package folder have to be in the project root folder and not in any subfolder like src or resources.
pom.xml
There are some more properties needed for doing the correct deploy. As you can see in the antrun plugin section, you need to reassign the properties for your ant environment before you can call the build file. The properties are automatically set to the called build file. Normaly Intellij Idea will create the pom.xml for you in the project root dir.
<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
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.autoap</groupId>
<artifactId>HelloWorld</artifactId>
<version>2.0</version>
<packaging>jar</packaging>
<properties>
<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
<mainClass>com.autoap.client.HelloWorld</mainClass>
<application.title>${project.artifactId}</application.title>
<copyright>Han Solo</copyright>
</properties>
<organization>
<name>Star Wars</name>
</organization>
<build>
<plugins>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-dependency-plugin</artifactId>
<version>2.6</version>
<executions>
<execution>
<id>unpack-dependencies</id>
<phase>package</phase>
<goals>
<goal>unpack-dependencies</goal>
</goals>
<configuration>
<excludeScope>system</excludeScope>
<excludeGroupIds>junit,org.mockito,org.hamcrest</excludeGroupIds>
<outputDirectory>${project.build.directory}/classes</outputDirectory>
</configuration>
</execution>
</executions>
</plugin>
<plugin>
<groupId>org.codehaus.mojo</groupId>
<artifactId>exec-maven-plugin</artifactId>
<version>1.2.1</version>
<executions>
<execution>
<id>default-cli</id>
<goals>
<goal>exec</goal>
</goals>
<configuration>
<executable>${java.home}/bin/java</executable>
<commandlineArgs>-jar '${project.build.directory}/dist/${project.build.finalName}-${project.version}.jar'
</commandlineArgs>
</configuration>
</execution>
</executions>
</plugin>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-compiler-plugin</artifactId>
<version>3.1</version>
<configuration>
<source>1.8</source>
<target>1.8</target>
</configuration>
</plugin>
<plugin>
<artifactId>maven-antrun-plugin</artifactId>
<version>1.8</version>
<executions>
<execution>
<phase>package</phase>
<configuration>
<target>
<property name="compile_classpath" refid="maven.compile.classpath"/>
<property name="outputDir" value="${project.build.outputDirectory}"/>
<property name="sourceDir" value="${project.build.sourceDirectory}"/>
<property name="distDir" value="${project.build.outputDirectory}/../dist"/>
<property name="javaHome" value="${java.home}"/>
<property name="versionNo" value="${project.version}"/>
<property name="mainClass" value="${mainClass}" />
<property name="appName" value="${application.title}"/>
<property name="appTitle" value="${application.title}"/>
<property name="appVendor" value="${project.organization.name}"/>
<property name="appCopyright" value="${copyright}"/>
<property name="appMenuGroup" value="${project.organization.name}"/>
<ant antfile="${basedir}/build.xml" target="default"/>
</target>
</configuration>
<goals>
<goal>run</goal>
</goals>
</execution>
</executions>
</plugin>
</plugins>
</build>
</project>
build.xml
I've tried to make it loosley coupled, so there is normaly no need to change anything in that file. Only if you want to have signing or special behaviour etc.The build.xml file should be saved in the project root dir.
<?xml version="1.0" encoding="UTF-8" ?>
<project name="App" default="default" basedir="."
xmlns:fx="javafx:com.sun.javafx.tools.ant">
<target name="default" depends="clean,compile">
<!-- defines the classpath -->
<path id="cp">
<filelist>
<file name="${javaHome}/../lib/ant-javafx.jar"/>
<file name="${basedir}" />
</filelist>
</path>
<!-- defines the task with a reference to classpath -->
<taskdef resource="com/sun/javafx/tools/ant/antlib.xml"
uri="javafx:com.sun.javafx.tools.ant"
classpathref="cp"/>
<fx:application id="appId"
name="${appName}"
mainClass="${mainClass}"
version="${versionNo}"/>
<!-- Defines the resources needed by the application -->
<fx:resources id="appRes">
<fx:fileset dir="${distDir}" includes="${appName}-${versionNo}.jar"/>
</fx:resources>
<!-- Create a jar file -->
<fx:jar destfile="${distDir}/${appName}-${versionNo}.jar">
<fx:application refid="appId"/>
<fx:resources refid="appRes"/>
<fileset dir="${outputDir}"/>
</fx:jar>
<fx:deploy width="300" height="250"
outdir="${distDir}" embedJNLP="true"
outfile="${appName}-${versionNo}"
nativebundles="exe" verbose="true">
<!-- define for ex. min javafx version -->
<!-- <fx:platform /> -->
<!-- defines the application and setup preferences -->
<fx:preferences shortcut="true" install="true" menu="true"/>
<!-- defines the application parts -->
<fx:application refId="appId"/>
<!-- defines the needed resources -->
<fx:resources refid="appRes"/>
<!-- defines the application info details -->
<fx:info title="${appTitle}"
vendor="${appVendor}"
copyright="${appCopyright}"/>
<!-- Some bundle arguments only for special platforms -->
<fx:bundleArgument arg="win.menuGroup" value="${appMenuGroup}"/>
</fx:deploy>
</target>
<!-- Removes the folders of previous runs -->
<target name="clean">
<mkdir dir="${outputDir}"/>
<mkdir dir="${distDir}"/>
<delete>
<fileset dir="${outputDir}" includes="**/*"/>
<fileset dir="${distDir}" includes="**/*"/>
</delete>
</target>
<!-- Compiles the sources -->
<target name="compile" depends="clean">
<javac includeantruntime="false"
srcdir="${sourceDir}"
destdir="${outputDir}"
fork="yes"
executable="${javaHome}/../bin/javac"
source="1.8"
debug="on">
</javac>
</target>
</project>
Images in package folder
The images in your package folder need to be renamed. The icon file need to be exactly (case-sensitive) named as the property application.title in your maven pom. The second file is the setup icon, it need the exact application title as first part and -setup-icon.bmp the last part. It needs to be a bmp. Sizes mentioned above.
My images looks like that:
Run configuration
The only thing you now need is to run the scripts to deploy it. For this you need a special run configuration like showing in the next screen:
App
After you have configured the run, run it and you will get the app. My App is nothing special only the default Hello World example and it looks like that:
Path to exe installer
In your project root is a folder target->dist->bundles, there you get your new Setup.exe
Installer with icon
Finally you got it.
Target structure
The target folder contains a non valid jar from the maven run, but it doesn't matter. You only should know, that if you only want the jar to start by double click, you need to choose the one in the dist folder. The jar in the dist folder is essential, because the whole process of creating an installer relies on this jar. Now you be also able to put a *.iss file in your package windows folder to customize more parts of the creation process, like a license file etc. For doing this, have a look here at the documention of Inno Setup.
For folks who are already using Maven to build a jar, building a native app and including an icon is easy with the javafx-maven-plugin. (I found it via this answer.)
The plugin developers have provided a nice little auto-configuration script. I had to add a <vendor> key, but then everything worked smoothly.
Once you have that working, all you have to do to get a custom icon is create a correctly-formatted file, give it exactly the same name as the native app, and drop it in the correct folder for the given system:
Windows: put some ICO-file at src/main/deploy/package/windows/{appname}.ico, where {appname} is the configured appname of your application
Mac OS(X): put some ICNS-file at src/main/deploy/package/macosx/{appname}.icns, where {appname} is the configured appname of your application
Linux: put some PNG-file at src/main/deploy/package/linux/{appname}.png, where {appname} is the configured appname of your application
(The text above was copied from this issue.)
I've tested this on both Windows and Mac, and it works in both cases.
Have you considered using launch4j? I have used it to create my exe files and it works flawlessly and allows you to set the icon. I use it coupled with izpack.
you neeed put the package folder in your root project. The output from console indicate the correct path. I know this Is old question but can help someone else.
I am trying to chance the icon of the exe file while creating native bundling of javafx packaging.
I tried adding icon into pom.xml but till it wont work out for me as it gives default icon
Using Intellij IDEA IDE which contain an Pom.xml creating an package by command = mvn jfx:build-native
Here is my pom.xml:
<build>
<plugins>
<plugin>
<groupId>com.zenjava</groupId>
<artifactId>javafx-maven-plugin</artifactId>
<version>1.5</version>
<configuration>
<mainClass>com.demoApp.testapp.testApplication</mainClass>
<!-- only required if signing the jar file -->
<keyStoreAlias>example-user</keyStoreAlias>
<keyStorePassword>example-password</keyStorePassword>
<permissions>
<permission>all-permissions</permission>
</permissions>
<icon>${basedir}/src/main/resources/images/logoIcon.ico</icon>
</configuration>
</plugin>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-compiler-plugin</artifactId>
<configuration>
<source>1.7</source>
<target>1.7</target>
</configuration>
</plugin>
</plugins>
</build>
I have added an icon path into pom.xml ${basedir}/src/main/resources/images/logoIcon.ico
that will run while native package execute but it wont work out for me
Is any other way to do it ?
Please suggest.
i tried fx tags in pom.xml using ant,here is my changes in pom.xml
<properties>
<javafx.tools.ant.jar>${env.JAVA_HOME}\lib\ant-javafx.jar</javafx.tools.ant.jar> </properties>
<plugin>
<artifactId>maven-antrun-plugin</artifactId>
<version>1.6</version>
<executions>
<execution>
<id>create-launcher-jar</id>
<phase>package</phase>
<goals>
<goal>run</goal>
</goals>
<configuration>
<target xmlns:fx="javafx:com.sun.javafx.tools.ant">
<taskdef
uri="javafx:com.sun.javafx.tools.ant"
resource="com/sun/javafx/tools/ant/antlib.xml"
classpath="${javafx.tools.ant.jar}"/>
<fx:application id="fxApp"
name="${project.name}"
mainClass="com.precisionhawk.flightplanner.FlightPlannerApp"/>
<fx:jar destfile="${project.build.directory}/${project.build.finalName}-launcher">
<fx:application refid="fxApp"/>
<fx:fileset dir="${project.build.directory}/classes"/>
</fx:jar>
<attachartifact file="${project.build.directory}/${project.build.finalName}-launcher.jar"
classifier="launcher"/>
<fx:deploy>
<fx:info>
<fx:icon href="${basedir}/src/main/deploy/logoIcon.ico"></fx:icon>
</fx:info>
</fx:deploy>
</target>
</configuration>
</execution>
</executions>
</plugin>
but it wont work out..
I just struggled with the same issue using Zonsky's great javafx-maven-plugin. As of version 1.5, which you also were using, the src/main/deploy directory will be added to the classpath. The icon you want to use could be added there and it will be available on the classpath for the native builder!
I added src/main/deploy/package/windows/myapp.ico there and it finally worked :)
For you:
Create src/main/deploy/package/windows/ folder
Add icon with name ${project.build.finalName}.ico
Run mvn jfx:build-native
I haven't played with it extensively - just got it to work and wanted to share. So if you want to use icon with different name, I don't know how. Not yet at least. The <icon>...</icon> section in the config section seems to be for webstart, so I haven't been using it.
Hope you get it to work!
You need to look at the logging while building a native app. That will tell you where the installer looks for the icon files and with wich name. For the default Windows native app it looks in ./package/windows/'appname'.ico
Can't remember where 'appname' comes from, but just look at the logging while building, it will tell you. (I use the Ant targets called from my pom btw)
you can do this:
`<plugin>
<groupId>com.zenjava</groupId>
<artifactId>javafx-maven-plugin</artifactId>
<version>8.8.3</version>
<configuration>
<vendor>YourCompany</vendor>
<mainClass>com.alan344.MapperGenApplication</mainClass>
<appName>mybatis-friend</appName>
<bundleArguments>
<icon>${project.basedir}/src/main/resources/image/icon.ico</icon>
</bundleArguments>
</configuration>
</plugin>`
recently I was involved in maintenance of a project.
This project is very old and the build process is all demanded to IBM RAD.
We have to rebuild the entire project from scratch, but in the meanwhile we have to maintain this old one.
I want to move to a CI system and automatize the build process using such software like Maven or Gradle (preferred).
The problem is that this project is using some IBM libraries to work with EJB (a field in which I'm very poor of knowledge and experience), and I have an ejbModule which is full of classes that aren't in SVN and are autogenerated from RAD (all stub classes).
What is the purpose of the stub?
After see this, I'm not very sure if is possible to automatize the build process, does someone have some experience with this?
Sorry for the lack of details, I don't know what I can add to be more detailed, incase something more is needed ask.
We have a system developed in RAD using ejb 2.0, deployed on to websphere 6.1 server
If you have a similar set-up you might be able to replicate the structure we used.
We used maven as the build tool, using the following plugins;
maven-ejb-plugin
was6-maven-plugin
xdoclet-maven-plugin
we used profiles to active the generation of the stubs when any of the interfaces changed, and xdoclet to annotate the bean class including websphere specific binding to generate the ejb-jar.xml and other ibm deployment files.
It took a few weeks to get it working and we have an automated build using hudson-ci, so might have to play around with the setup of the pom and plugins to adapt to your project.
sample of our pom.xml;
<groupId>your.group.id</groupId>
<artifactId>your.artifact.id</artifactId>
<packaging>ejb</packaging>
<build>
<plugins>
<plugin>
<artifactId>maven-ejb-plugin</artifactId>
<configuration>
<ejbVersion>2.0</ejbVersion>
<generateClient>true</generateClient>
<clientIncludes>
<clientInclude>**/interface/**</clientInclude>
</clientIncludes>
</configuration>
</plugin>
</plugins>
</build>
<profiles>
<profile>
<id>xdoclet</id>
<activation>
<property>
<name>xdoclet</name>
</property>
</activation>
<build>
<plugins>
<plugin>
<groupId>org.codehaus.mojo</groupId>
<artifactId>xdoclet-maven-plugin</artifactId>
<executions>
<execution>
<phase>generate-sources</phase>
<goals>
<goal>xdoclet</goal>
</goals>
<configuration>
<tasks>
<ejbdoclet
destDir="${project.build.sourceDirectory}"
force="true" ejbSpec="2.0"
verbose="true">
<fileset
dir="${project.build.sourceDirectory}">
<include name="**/*Bean.java" />
</fileset>
<packageSubstitution
packages="service" useFirst="true"
substituteWith="interface" />
<homeinterface />
<remoteinterface />
<deploymentdescriptor
displayname="Service Name"
description=""
destDir="${basedir}/src/main/resources/META-INF"
validateXML="true" useIds="true" />
<websphere
destDir="${basedir}/src/main/resources/META-INF"
validateXML="true" />
</ejbdoclet>
</tasks>
</configuration>
</execution>
</executions>
</plugin>
</profile>
<profile>
<id>was-ejb</id>
<activation>
<property>
<name>was-ejb</name>
</property>
</activation>
<build>
<plugins>
<plugin>
<groupId>org.codehaus.mojo</groupId>
<artifactId>was6-maven-plugin</artifactId>
<executions>
<execution>
<goals>
<goal>ejbdeploy</goal>
</goals>
</execution>
</executions>
<configuration>
<wasHome>C:/Program Files/IBM/WebSphere/AppServer</wasHome>
</configuration>
</plugin>
</plugins>
</profile>
</profiles>