SlideShare ist ein Scribd-Unternehmen logo
1 von 109
Downloaden Sie, um offline zu lesen
Java Web Start czyli jak żyć z
tą dziwną technologią? &
Continuous Delivery w
projekcie Open Source
Marcin Stachniuk
@MarcinStachniuk
mstachniuk.blogspot.com
JUG Łódź 20.04.2017
O mnie
● Marcin Stachniuk
● Twitter: @MarcinStachniuk
● Blog: mstachniuk.blogspot.com
● WrocJUG
● Recenzent książki Practical Unit Testing
● Speker na konferencjach: 33rd degree 4
charity, dbconf.pl, warsjawa.pl,
devcrowd.pl, chamberconf.pl,
careercon.pl, itcareersummit.pl
● Mockito release tools team member
● Chorąży na ChamberConf
DEVCROWD
Szczecin, 22 kwietnia 2017
Agenda
● Introduction
● Build Pipeline
● Continuous Integration
● Continuous Delivery
● Code Quality
● Nice Badges
● Promotion in the Internet
● Alternatives
● Q&A
● Bonuses
● What is Java Web Start?
● How it works?
● What can go wrong?
● Solution
● How does IceBoar works?
● Benefits
● Q&A
Agenda
● Introduction
● Build Pipeline
● Continuous Integration
● Continuous Delivery
● Code Quality
● Nice Badges
● Promotion in the Internet
● Alternatives
● Q&A
● Bonuses
● What is Java Web Start?
● How it works?
● What can go wrong?
● Solution
● How does IceBoar works?
● Benefits
● Q&A
+
Agenda
● Introduction
● Build Pipeline
● Continuous Integration
● Continuous Delivery
● Code Quality
● Nice Badges
● Promotion in the Internet
● Alternatives
● Q&A
● Bonuses
+
● What is Java Web Start?
● How it works?
● What can go wrong?
● Solution
● How does IceBoar works?
● Benefits
● Q&A
Java Web Start – jak żyć z tą
dziwną technologią?
Marcin Stachniuk
Java Platform Standard Edition 8 Documentation
https://docs.oracle.com/javase/8/docs/
Java Platform Tutorial: Swing
https://docs.oracle.com/javase/tutorial/uiswing/components/text.html
Example JNLP file
<?xml version="1.0" encoding="utf-8"?>
<!-- JNLP File for TextSamplerDemo -->
<jnlp
spec="1.0+"
codebase="https://docs.oracle.com/javase/tutorialJWS/samples/uiswing/TextSamplerDemoProject"
href="TextSamplerDemo.jnlp">
<information>
<title>TextSamplerDemo</title>
<vendor>The Java(tm) Tutorial</vendor>
<homepage
href="https://docs.oracle.com/javase/tutorial/uiswing/examples/components/index.html#TextSamplerDemo"/>
<description>TextSamplerDemo</description>
<description kind="short">Uses one of each of Swing's text components.</description>
<offline-allowed/>
</information>
<resources>
<j2se version="1.7+"/>
<jar href="TextSamplerDemo.jar"/>
</resources>
<application-desc main-class="components.TextSamplerDemo"/>
</jnlp>
Java Web Start Sequence Diagram
Java Web Start Sequence Diagram
click
Java Web Start Sequence Diagram
click
download
Java Web Start Sequence Diagram
click
download
run
Java Web Start Sequence Diagram
click
download
run
are you sure?
Java Web Start Sequence Diagram
click
download
run
are you sure?
download
JARs
Java Web Start Sequence Diagram
run application
on javaws
click
download
run
are you sure?
download
JARs
Java Web Start Sequence Diagram
run application
on javaws
click
download
run
are you sure?
download
JARs
What could possibly go wrong?
In JNLP: <j2se version="1.7"/> User: Java 1.8
What could possibly go wrong?
● Different Java versions installed on client machines
● Sometimes javaws wants download and install latest JRE
version
● Different behavior depending on Operating System and
installed JRE version
● From some point of time apps needs to signed (Self-signed
are blocked)
● Application started in sandbox (javaws or jp2launcher)
Problem solution
Problem solution
Problem solution
https://github.com/Roche/IceBoar
How IceBoar works?
How IceBoar works?
click
How IceBoar works?
click
download
How IceBoar works?
click
download
run
How IceBoar works?
click
download
run
are you sure?
How IceBoar works?
click
download
run
are you sure?
download
& run
How IceBoar works?
click
download
run
are you sure?
download
& run
download JRE
How IceBoar works?
click
download
run
are you sure?
download
& run
download JRE
download JARs
How IceBoar works?
click
download
run
are you sure?
download
& run
download JRE
download JARs
run on
our JRE
How IceBoar works?
click
download
run
are you sure?
download
& run
download JRE
download JARs
run on
our JRE
How IceBoar works?
click
download
run
are you sure?
download
& run
download JRE
download JARs
run on
our JRE
Demo
Profits
● We know a target JVM version
● Application start outside a sandbox (java instead of
javaws)
● We sign only IceBoar jar
● Users don’t need admin rights to install JRE
How to introduce IceBoar into a project?
<dependency>
<groupId>com.roche</groupId>
<artifactId>ice-boar</artifactId>
<version>${project.version}</version>
<classifier>jar-with-dependencies</classifier>
</dependency>
How to introduce IceBoar into a project?
<jnlp spec="1.0+" codebase="${codebase}">
<information>
....
</information>
<security>
<all-permissions/>
</security>
<resources>
<j2se version="1.5+" href="http://java.sun.com/products/autodl/j2se"/>
<jar href="${jre.and.jars.host}/${jars.path}/ice-boar-1.0-jar-with-dependencies.jar"/>
<property name="jnlp.IceBoar.close-on-end" value="false"/>
<property name="jnlp.IceBoar.main-class" value="com.roche.iceboar.helloworldswing.HelloWorld"/>
<property name="jnlp.IceBoar.jar.0"
value="${jre.and.jars.host}/${jars.path}/ice-boar-hello-world-swing-${version}-jar-with-dependencies.jar"/>
<property name="jnlp.IceBoar.splash" value="${jre.and.jars.host}/img/ice-boar-splash.png"/>
</resources>
<application-desc main-class="com.roche.iceboar.IceBoar">
</application-desc>
</jnlp>
Site with examples
http://roche.github.io/IceBoar/
Other features of IceBoar?
● Custom splash screen during loading
● No frame around splash screen
● Custom title and icon
● Starting application using pre-installed JRE
● Cache for downloaded JRE (for slow connections)
● Window with logs output
● Disable auto closing IceBoar window after starting target
application
Questions
?
Continuous Delivery w
projekcie Open Source
Continuous Delivery Vs. Continuous Deployment
Continuous Delivery Vs. Continuous Deployment
https://puppet.com/blog/continuous-delivery-vs-continuous-deployment-what-s-diff
Inspiration
JDD2014: Continuous Delivery: Capitalizing High Quality Automated Tests (Sz. Faber)
https://www.youtube.com/watch?v=Lda4RuQDQN0
Build Pipeline
Continuous Delivery
</>
Continuous Delivery
</>
code
github.io
github.com travis-ci.org
codecov.io
bintray.com
oss.jfrog.org
search.maven.org
Continuous Delivery
</>
Continuous Delivery
</>
1 git push
Continuous Delivery
</>
1 git push
2 webhook
build
Continuous Delivery
</>
1 git push
2 webhook
build
3 deploy
release
snapshot
Continuous Delivery
</>
1 git push
2 webhook
build
3 deploy
release
snapshot
4 commit
to
gh-pages
Continuous Delivery
</>
1 git push
2 webhook
build
3 deploy
release
snapshot
4 commit
to
gh-pages
5 update
gh-pages
Continuous Delivery
</>
1 git push
2 webhook
build
3 deploy
release
snapshot
6 code coverage
4 commit
to
gh-pages
5 update
gh-pages
Continuous Delivery
</>
1 git push
2 webhook
build
3 deploy
release
snapshot
6 code coverage
7 sing & publish
(manual)
4 commit
to
gh-pages
5 update
gh-pages
Continuous Delivery Deployment
</>
1 git push
2 webhook
build
3 deploy
release
snapshot
6 code coverage
7 sing & publish
(manual)
4 commit
to
gh-pages
5 update
gh-pages
7 sing & publish
auto
not implemented
dream
Continuous Integration
Continuous Integration
https://travis-ci.org
● Free for Open Source Projects
● Easy setup with GitHub
● Container based architecture (Doker)
● Stateless
Continuous Integration
https://travis-ci.org
● Free for Open Source Projects
● Easy setup with GitHub
● Container based architecture (Doker)
● Stateless
● Multi language support (ANDROID, C, C#, C++, CLOJURE,
CRYSTAL, D, DART, ERLANG, ELIXIR, F#, GO, GROOVY,
HASKELL, HAXE, JAVA, JAVASCRIPT (WITH NODE.JS), JULIA,
OBJECTIVE-C, PERL, PERL6, PHP, PYTHON, R, RUBY, RUST,
SCALA, SMALLTALK, VISUAL BASIC)
● For Java: Oracle JDK 7 (default), Oracle JDK 8, OpenJDK 6,
OpenJDK 7, Gradle 2.0, Maven 3.2 and Ant 1.8
● Notifications via: Slack, HipChat, Emails and more
How to set up Travis-CI
.travis.yml
language: java
script: mvn clean install
jdk:
- oraclejdk8
● Sign in to travis-ci.org using GitHub account
● Choose project (you need to have admin rights to this project)
● Add .travis.yml to your root project folder
Default Travis-CI java build
.travis.yml
language: java
jdk:
- oraclejdk8
.travis.yml
language: java
install: mvn install -DskipTests=true -Dmaven.javadoc.skip=true -B -V
script: mvn test -B
jdk:
- oraclejdk8
Default Travis-CI maven build seps:
● install
● script
Default Travis-CI java build
.travis.yml
language: java
jdk:
- oraclejdk8
.travis.yml
language: java
install: mvn install -DskipTests=true -Dmaven.javadoc.skip=true -B -V
script: mvn test -B
jdk:
- oraclejdk8
Default Travis-CI maven build seps:
● install
● script
Default Travis-CI java build
.travis.yml
language: java
jdk:
- oraclejdk8
.travis.yml
language: java
install: mvn install -DskipTests=true -Dmaven.javadoc.skip=true -B -V
script: mvn test -B
jdk:
- oraclejdk8
Default Travis-CI maven build seps:
● install
● script
Store sensitive data (passwords) on travis-ci
<settings ...>
<servers>
<server>
<id>bintray-stachnim-IceBoar</id>
<username>${env.CI_DEPLOY_USERNAME}</username>
<password>${env.CI_DEPLOY_PASSWORD}</password>
</server>
settings.xml
Store sensitive data (passwords) on travis-ci
Store sensitive data (passwords) on travis-ci
Current IceBoar Build in nutshell
#!/bin/bash
set -ev
if [ "${TRAVIS_PULL_REQUEST}" = "false" ];
then
cd ice-boar && mvn clean deploy --settings …
else
cd ice-boar && mvn clean install && ...
fi
build-travis.sh
language: java
script: ./build-travis.sh
jdk:
- oraclejdk8
.travis.yml
Continuous Delivery
Release artifact to Maven Central is not so easy
● Hard to sign in / create account (need to find link and create an issue)
● Manual verification of uploaded artifact
Release artifact to Maven Central is not so easy
Complicated Requirements:
● Supply Javadoc and Sources
● Sign Files with GPG/PGP
● Sufficient Metadata (pom file)
● Correct Coordinates (groupId, artifactId, version)
● Project Name, Description and URL
● License Information
● Developer Information
● SCM Information
Release artifact to bintray
● Sign in with GitHub
● Add new package to maven repository, configure it
● Deploy to bintray (from Travis-CI)
● You don’t need to sign your artifact
Bintray general repository settings
Bintray deploy to Maven Central
● You can’t store user token password :-(
● This will be manual step :-(
Google Developers: The Secret to Safe Continuous Deployment
www.youtube.com/watch?v=UMnZiTL0tUc
github.com/bslatkin/dpxdt
Code Quality
Code Quality with codecov.io
● Sign in to codecov.io with GitHub
● Configure jacoco-maven-plugin
● Add to .travis.yml:
language: java
script: ./build-travis.sh
jdk:
- oraclejdk8
before_install:
- pip install --user codecov
after_success:
- codecov
.travis.yml
Codecov see Code Coverage
Codecov Extension (for Chrome) - see coverage on GitHub
https://chrome.google.com/webstore/detail/codecov-extension/
Codecov suggestions
IceBoar build in details
IceBoar project structure in details
Roche/IceBoar pom.xml (project name: ice-boar-build)
ice-boar (without reference to parent pom)
ice-boar-samples
ice-boar-demo-gh-pages
ice-boar-demo
ice-boar-hello-world-swing
Current IceBoar Build in details
language: java
script: ./build-travis.sh
jdk:
- oraclejdk8
before_install:
- pip install --user codecov
after_success:
- codecov
cache:
directories:
- $HOME/.m2 // cache dir between builds
install: true // skip install script
.travis.yml
Current IceBoar Build in details
#!/bin/bash
set -ev
if [ "${TRAVIS_PULL_REQUEST}" = "false" ]; then
...
else
cd ice-boar
mvn clean install
cd ..
mvn clean install -U
fi
build-travis.sh
set -ev
-e fail fast
-v print all lines in
the script before
executing them
Current IceBoar Build in details
cd ice-boar
mvn clean deploy --settings settings.xml
cd ..
mvn clean install -U
cd ice-boar-samples/ice-boar-demo-gh-pages/
mvn clean install -P ghpages
git clone https://github.com/Roche/IceBoar
cd IceBoar
git checkout gh-pages && 
cp -R ../target/ice-boar-demo-gh-pages/* .
build-travis.sh Roche/IceBoar
ice-boar
ice-boar-samples
ice-boar-demo-gh-pages
ice-boar-demo
ice-boar-hello-world-swing
Current IceBoar Build in details
cd ice-boar
mvn clean deploy --settings settings.xml
cd ..
mvn clean install -U
cd ice-boar-samples/ice-boar-demo-gh-pages/
mvn clean install -P ghpages
git clone https://github.com/Roche/IceBoar
cd IceBoar
git checkout gh-pages && 
cp -R ../target/ice-boar-demo-gh-pages/* .
build-travis.sh Roche/IceBoar
ice-boar
ice-boar-samples
ice-boar-demo-gh-pages
ice-boar-demo
ice-boar-hello-world-swing
Current IceBoar Build in details
cd ice-boar
mvn clean deploy --settings settings.xml
cd ..
mvn clean install -U
cd ice-boar-samples/ice-boar-demo-gh-pages/
mvn clean install -P ghpages
git clone https://github.com/Roche/IceBoar
cd IceBoar
git checkout gh-pages && 
cp -R ../target/ice-boar-demo-gh-pages/* .
build-travis.sh Roche/IceBoar
ice-boar
ice-boar-samples
ice-boar-demo-gh-pages
ice-boar-demo
ice-boar-hello-world-swing
Current IceBoar Build in details
cd ice-boar
mvn clean deploy --settings settings.xml
cd ..
mvn clean install -U
cd ice-boar-samples/ice-boar-demo-gh-pages/
mvn clean install -P ghpages
git clone https://github.com/Roche/IceBoar
cd IceBoar
git checkout gh-pages && 
cp -R ../target/ice-boar-demo-gh-pages/* .
build-travis.sh Roche/IceBoar
ice-boar
ice-boar-samples
ice-boar-demo-gh-pages
ice-boar-demo
ice-boar-hello-world-swing
IceBoar
Current IceBoar Build in details
cd ice-boar
mvn clean deploy --settings settings.xml
cd ..
mvn clean install -U
cd ice-boar-samples/ice-boar-demo-gh-pages/
mvn clean install -P ghpages
git clone https://github.com/Roche/IceBoar
cd IceBoar
git checkout gh-pages && 
cp -R ../target/ice-boar-demo-gh-pages/* .
build-travis.sh Roche/IceBoar
ice-boar
ice-boar-samples
ice-boar-demo-gh-pages
ice-boar-demo
ice-boar-hello-world-swing
IceBoar
Current IceBoar Build in details
git config user.name "Marcin Stachniuk"
git config user.email mstachniuk@...com
git add -A
git commit -m "update gh-pages by Travis-CI"
git push ${GIT_HUB_REPO_SECRET}
build-travis.sh Roche/IceBoar
ice-boar
ice-boar-samples
ice-boar-demo-gh-pages
ice-boar-demo
ice-boar-hello-world-swing
IceBoar
Nice badges
Nice badges
shields.io
Promotion in the
Internet
What is important for users?
● Nice demo page with example usage: roche.github.io/IceBoar/
What is important for users?
● Easy setup for contributors
What is important for promotion?
● Stack Overflow: stackoverflow.com/search?q=ice+boar
How to promote in the Internet?
● Blogposts
● Another forums, groups, etc.
● Hackergarten (1 Pull Request,1 commit, 2 contributors)
● Presentations at JUG’s and conferences
● Coding in train (1 Pull Request, 16 commits, 1 contributor)
Alternatives
Alternatives to Travic-CI
● gitlab.com
● BitBucket host in the cloud
● teamcity.codebetter.com/login.html
● teamcity.jetbrains.com
● www.appveyor.com (for .NET)
● scrutinizer-ci.com (+ code metrics)
● codeship.com (run Docker’s, support for: Ruby (Rails), Node.js, PHP, Python,
Java, Go)
● magnum-ci.com (+ code metrics)
● circleci.com
● www.visualstudio.com/en-us/products/visual-studio-team-services-vs.aspx
● app.shippable.com (support for Ruby, Python, Java, Node.js, Scala, PHP,
Clojure, Go)
● www.snap-ci.com (by ThoughtWorks)
Alternatives for codecov.io
● coveralls.io
● nemo.sonarqube.org (BETA - need to write an e-mail on e-mail list for account)
● sonar.qatools.ru
● coverity.com (for: C, C++, C#, Java)
● www.codacy.com (for Scala, Ruby, Java, JavaScript, Python, Php)
Others
● javadoc.io
Bonus
LuxLekarz - LuxMed + ZnanyLekarz
github.com/mstachniuk/LuxLekarz
Mockito Release Tools
github.com/mockito/mockito-release-tools
https://github.com/mockito/mockito/blob/release/2.x/doc/release-notes/official.md
Mockito Release Tools Vision
github.com/mockito/mockito-release-tools
● Easy setup
● Auto generation of release notes (notable and regular)
● Include contributors in pom.xml
● Auto update releases on GitHub
● CI create git tag, update release notes in repository, bump version
● Release artifacts only when binary was changed
● Million of users ;-)
Questions
?
Links
● https://puppet.com/blog/continuous-delivery-vs-continuous-deployment-what-s-diff Continuous Delivery Vs.
Continuous Deployment: What's the Diff?
● https://www.youtube.com/watch?v=Lda4RuQDQN0 Szczepan Faber about Continuous Delivery
● https://docs.oracle.com/javase/8/docs/ Java Platform Standard Edition 8 Documentation
● https://github.com/Roche/IceBoar IceBoar on GitHub
● https://github.com GitHub Source Code repository
● https://github.io GitHub Pages
● https://travis-ci.org Travis-CI Continuous Integration Server
● https://codecov.io Collect your code coverage
● https://bintray.com Popular repository for your artifacts (not only Jar files)
● https://oss.jfrog.org Repository for OSS snapshots
● https://search.maven.org The Maven Central
● https://docs.travis-ci.com/user/pull-requests#Security-Restrictions-when-testing-Pull-Requests Why sometimes
PR from fork fail on Travis-Ci
● http://central.sonatype.org/pages/requirements.html Requirements for release in to Maven Central
● https://issues.sonatype.org Create issue for new account on Maven Central
● https://www.youtube.com/watch?v=UMnZiTL0tUc Google Developers The Secret to Safe Continuous Deployment
● https://chrome.google.com/webstore/detail/codecov-extension Codecov extension (for Google Chrome)
● http://shields.io Nice badges generator
● https://roche.github.io/IceBoar Demo page for IceBoar
● http://stackoverflow.com/search?q=ice+boar IceBoar on Stack Overflow
Java Web Start czyli jak żyć z
tą dziwną technologią? &
Continuous Delivery w
projekcie Open Source
Marcin Stachniuk
@MarcinStachniuk
mstachniuk.blogspot.com
JUG Łódź 20.04.2017 Dziękuję!

Weitere ähnliche Inhalte

Was ist angesagt?

Curious Coders Java Web Frameworks Comparison
Curious Coders Java Web Frameworks ComparisonCurious Coders Java Web Frameworks Comparison
Curious Coders Java Web Frameworks ComparisonHamed Hatami
 
html5 & phonegap
html5 & phonegaphtml5 & phonegap
html5 & phonegapCaesar Chi
 
[CLIW] Web testing
[CLIW] Web testing[CLIW] Web testing
[CLIW] Web testingBogdan Gaza
 
行動應用開發實務 - Gradle 介紹
行動應用開發實務 - Gradle 介紹行動應用開發實務 - Gradle 介紹
行動應用開發實務 - Gradle 介紹Kyle Lin
 
Spark IT 2011 - Java EE 6 Workshop
Spark IT 2011 - Java EE 6 WorkshopSpark IT 2011 - Java EE 6 Workshop
Spark IT 2011 - Java EE 6 WorkshopArun Gupta
 
Hybrid Apps (Native + Web) via QtWebKit
Hybrid Apps (Native + Web) via QtWebKitHybrid Apps (Native + Web) via QtWebKit
Hybrid Apps (Native + Web) via QtWebKitAriya Hidayat
 
Mobile Development with Ionic, React Native, and JHipster - AllTheTalks 2020
Mobile Development with Ionic, React Native, and JHipster - AllTheTalks 2020Mobile Development with Ionic, React Native, and JHipster - AllTheTalks 2020
Mobile Development with Ionic, React Native, and JHipster - AllTheTalks 2020Matt Raible
 
Seven Simple Reasons to Use AppFuse
Seven Simple Reasons to Use AppFuseSeven Simple Reasons to Use AppFuse
Seven Simple Reasons to Use AppFuseMatt Raible
 
Choosing a Java Web Framework
Choosing a Java Web FrameworkChoosing a Java Web Framework
Choosing a Java Web FrameworkWill Iverson
 
Front End Development for Backend Developers - GIDS 2019
Front End Development for Backend Developers - GIDS 2019Front End Development for Backend Developers - GIDS 2019
Front End Development for Backend Developers - GIDS 2019Matt Raible
 
Mobile Development with Ionic, React Native, and JHipster - ACGNJ Java Users ...
Mobile Development with Ionic, React Native, and JHipster - ACGNJ Java Users ...Mobile Development with Ionic, React Native, and JHipster - ACGNJ Java Users ...
Mobile Development with Ionic, React Native, and JHipster - ACGNJ Java Users ...Matt Raible
 
Automate testing with behat, selenium, phantom js and nightwatch.js (5)
Automate testing with behat, selenium, phantom js and nightwatch.js (5)Automate testing with behat, selenium, phantom js and nightwatch.js (5)
Automate testing with behat, selenium, phantom js and nightwatch.js (5)Faichi Solutions
 
codemotion-docker-2014
codemotion-docker-2014codemotion-docker-2014
codemotion-docker-2014Carlo Bonamico
 
Introduction to Google Web Toolkit
Introduction to Google Web ToolkitIntroduction to Google Web Toolkit
Introduction to Google Web ToolkitDidier Girard
 
Javaland 2014 / GWT architectures and lessons learned
Javaland 2014 / GWT architectures and lessons learnedJavaland 2014 / GWT architectures and lessons learned
Javaland 2014 / GWT architectures and lessons learnedpgt technology scouting GmbH
 
How do I write Testable Javascript - Presented at dev.Objective() June 16, 2016
How do I write Testable Javascript - Presented at dev.Objective() June 16, 2016How do I write Testable Javascript - Presented at dev.Objective() June 16, 2016
How do I write Testable Javascript - Presented at dev.Objective() June 16, 2016Gavin Pickin
 
High Performance JavaScript 2011
High Performance JavaScript 2011High Performance JavaScript 2011
High Performance JavaScript 2011Nicholas Zakas
 
GDD HTML5, Flash, and the Battle for Faster Cat Videos
GDD HTML5, Flash, and the Battle for Faster Cat VideosGDD HTML5, Flash, and the Battle for Faster Cat Videos
GDD HTML5, Flash, and the Battle for Faster Cat VideosGreg Schechter
 

Was ist angesagt? (20)

Curious Coders Java Web Frameworks Comparison
Curious Coders Java Web Frameworks ComparisonCurious Coders Java Web Frameworks Comparison
Curious Coders Java Web Frameworks Comparison
 
html5 & phonegap
html5 & phonegaphtml5 & phonegap
html5 & phonegap
 
[CLIW] Web testing
[CLIW] Web testing[CLIW] Web testing
[CLIW] Web testing
 
行動應用開發實務 - Gradle 介紹
行動應用開發實務 - Gradle 介紹行動應用開發實務 - Gradle 介紹
行動應用開發實務 - Gradle 介紹
 
Spark IT 2011 - Java EE 6 Workshop
Spark IT 2011 - Java EE 6 WorkshopSpark IT 2011 - Java EE 6 Workshop
Spark IT 2011 - Java EE 6 Workshop
 
Hybrid Apps (Native + Web) via QtWebKit
Hybrid Apps (Native + Web) via QtWebKitHybrid Apps (Native + Web) via QtWebKit
Hybrid Apps (Native + Web) via QtWebKit
 
Mobile Development with Ionic, React Native, and JHipster - AllTheTalks 2020
Mobile Development with Ionic, React Native, and JHipster - AllTheTalks 2020Mobile Development with Ionic, React Native, and JHipster - AllTheTalks 2020
Mobile Development with Ionic, React Native, and JHipster - AllTheTalks 2020
 
Seven Simple Reasons to Use AppFuse
Seven Simple Reasons to Use AppFuseSeven Simple Reasons to Use AppFuse
Seven Simple Reasons to Use AppFuse
 
Os Johnson
Os JohnsonOs Johnson
Os Johnson
 
Choosing a Java Web Framework
Choosing a Java Web FrameworkChoosing a Java Web Framework
Choosing a Java Web Framework
 
Front End Development for Backend Developers - GIDS 2019
Front End Development for Backend Developers - GIDS 2019Front End Development for Backend Developers - GIDS 2019
Front End Development for Backend Developers - GIDS 2019
 
Mobile Development with Ionic, React Native, and JHipster - ACGNJ Java Users ...
Mobile Development with Ionic, React Native, and JHipster - ACGNJ Java Users ...Mobile Development with Ionic, React Native, and JHipster - ACGNJ Java Users ...
Mobile Development with Ionic, React Native, and JHipster - ACGNJ Java Users ...
 
Automate testing with behat, selenium, phantom js and nightwatch.js (5)
Automate testing with behat, selenium, phantom js and nightwatch.js (5)Automate testing with behat, selenium, phantom js and nightwatch.js (5)
Automate testing with behat, selenium, phantom js and nightwatch.js (5)
 
codemotion-docker-2014
codemotion-docker-2014codemotion-docker-2014
codemotion-docker-2014
 
Introduction to Google Web Toolkit
Introduction to Google Web ToolkitIntroduction to Google Web Toolkit
Introduction to Google Web Toolkit
 
Javaland 2014 / GWT architectures and lessons learned
Javaland 2014 / GWT architectures and lessons learnedJavaland 2014 / GWT architectures and lessons learned
Javaland 2014 / GWT architectures and lessons learned
 
How do I write Testable Javascript - Presented at dev.Objective() June 16, 2016
How do I write Testable Javascript - Presented at dev.Objective() June 16, 2016How do I write Testable Javascript - Presented at dev.Objective() June 16, 2016
How do I write Testable Javascript - Presented at dev.Objective() June 16, 2016
 
High Performance JavaScript 2011
High Performance JavaScript 2011High Performance JavaScript 2011
High Performance JavaScript 2011
 
Groovy Maven Builds
Groovy Maven BuildsGroovy Maven Builds
Groovy Maven Builds
 
GDD HTML5, Flash, and the Battle for Faster Cat Videos
GDD HTML5, Flash, and the Battle for Faster Cat VideosGDD HTML5, Flash, and the Battle for Faster Cat Videos
GDD HTML5, Flash, and the Battle for Faster Cat Videos
 

Ähnlich wie Java Web Start czyli jak żyć z tą dziwną technologią? & Continuous Delivery w projekcie Open Source - Marcin Stachniuk JUG Łódź

Continuous Delivery w projekcie Open Source - Marcin Stachniuk - DevCrowd 2017
Continuous Delivery w projekcie Open Source - Marcin Stachniuk - DevCrowd 2017Continuous Delivery w projekcie Open Source - Marcin Stachniuk - DevCrowd 2017
Continuous Delivery w projekcie Open Source - Marcin Stachniuk - DevCrowd 2017MarcinStachniuk
 
Creating a reasonable project boilerplate
Creating a reasonable project boilerplateCreating a reasonable project boilerplate
Creating a reasonable project boilerplateStanislav Petrov
 
Continuous delivery w projekcie open source - Marcin Stachniuk
Continuous delivery w projekcie open source - Marcin StachniukContinuous delivery w projekcie open source - Marcin Stachniuk
Continuous delivery w projekcie open source - Marcin StachniukMarcinStachniuk
 
What Visual Studio Code can do for Java Development
What Visual Studio Code can do for Java DevelopmentWhat Visual Studio Code can do for Java Development
What Visual Studio Code can do for Java DevelopmentEd Burns
 
GeoServer Developers Workshop
GeoServer Developers WorkshopGeoServer Developers Workshop
GeoServer Developers WorkshopJody Garnett
 
JavaFX - Sketch Board to Production
JavaFX - Sketch Board to ProductionJavaFX - Sketch Board to Production
JavaFX - Sketch Board to ProductionYoav Aharoni
 
Django simplified : by weever mbakaya
Django simplified : by weever mbakayaDjango simplified : by weever mbakaya
Django simplified : by weever mbakayaMbakaya Kwatukha
 
JavaScript Revolution - 5/Nov/13 - PrDC Saskatoon, SK
JavaScript Revolution - 5/Nov/13 - PrDC Saskatoon, SKJavaScript Revolution - 5/Nov/13 - PrDC Saskatoon, SK
JavaScript Revolution - 5/Nov/13 - PrDC Saskatoon, SKDavid Wesst
 
Introduction to react native @ TIC NUST
Introduction to react native @ TIC NUSTIntroduction to react native @ TIC NUST
Introduction to react native @ TIC NUSTWaqqas Jabbar
 
The Path Towards Spring Boot Native Applications
The Path Towards Spring Boot Native ApplicationsThe Path Towards Spring Boot Native Applications
The Path Towards Spring Boot Native ApplicationsVMware Tanzu
 
Rock Solid Deployment of Web Applications
Rock Solid Deployment of Web ApplicationsRock Solid Deployment of Web Applications
Rock Solid Deployment of Web ApplicationsPablo Godel
 
Architecture & Workflow of Modern Web Apps
Architecture & Workflow of Modern Web AppsArchitecture & Workflow of Modern Web Apps
Architecture & Workflow of Modern Web AppsRasheed Waraich
 
Jython on Django
Jython on DjangoJython on Django
Jython on Djangofwierzbicki
 
Plugin Development @ WordCamp Norway 2014
Plugin Development @ WordCamp Norway 2014Plugin Development @ WordCamp Norway 2014
Plugin Development @ WordCamp Norway 2014Barry Kooij
 
Browser Automated Testing Frameworks - Nightwatch.js
Browser Automated Testing Frameworks - Nightwatch.jsBrowser Automated Testing Frameworks - Nightwatch.js
Browser Automated Testing Frameworks - Nightwatch.jsLuís Bastião Silva
 
Continuous Delivery for Front-End Engineers
Continuous Delivery for Front-End EngineersContinuous Delivery for Front-End Engineers
Continuous Delivery for Front-End EngineersSergey Bolshchikov
 

Ähnlich wie Java Web Start czyli jak żyć z tą dziwną technologią? & Continuous Delivery w projekcie Open Source - Marcin Stachniuk JUG Łódź (20)

Continuous Delivery w projekcie Open Source - Marcin Stachniuk - DevCrowd 2017
Continuous Delivery w projekcie Open Source - Marcin Stachniuk - DevCrowd 2017Continuous Delivery w projekcie Open Source - Marcin Stachniuk - DevCrowd 2017
Continuous Delivery w projekcie Open Source - Marcin Stachniuk - DevCrowd 2017
 
Creating a reasonable project boilerplate
Creating a reasonable project boilerplateCreating a reasonable project boilerplate
Creating a reasonable project boilerplate
 
Continuous delivery w projekcie open source - Marcin Stachniuk
Continuous delivery w projekcie open source - Marcin StachniukContinuous delivery w projekcie open source - Marcin Stachniuk
Continuous delivery w projekcie open source - Marcin Stachniuk
 
What Visual Studio Code can do for Java Development
What Visual Studio Code can do for Java DevelopmentWhat Visual Studio Code can do for Java Development
What Visual Studio Code can do for Java Development
 
GeoServer Developers Workshop
GeoServer Developers WorkshopGeoServer Developers Workshop
GeoServer Developers Workshop
 
JavaFX - Sketch Board to Production
JavaFX - Sketch Board to ProductionJavaFX - Sketch Board to Production
JavaFX - Sketch Board to Production
 
Django simplified : by weever mbakaya
Django simplified : by weever mbakayaDjango simplified : by weever mbakaya
Django simplified : by weever mbakaya
 
JavaScript Revolution - 5/Nov/13 - PrDC Saskatoon, SK
JavaScript Revolution - 5/Nov/13 - PrDC Saskatoon, SKJavaScript Revolution - 5/Nov/13 - PrDC Saskatoon, SK
JavaScript Revolution - 5/Nov/13 - PrDC Saskatoon, SK
 
Introduction to react native @ TIC NUST
Introduction to react native @ TIC NUSTIntroduction to react native @ TIC NUST
Introduction to react native @ TIC NUST
 
The Path Towards Spring Boot Native Applications
The Path Towards Spring Boot Native ApplicationsThe Path Towards Spring Boot Native Applications
The Path Towards Spring Boot Native Applications
 
tut0000021-hevery
tut0000021-heverytut0000021-hevery
tut0000021-hevery
 
tut0000021-hevery
tut0000021-heverytut0000021-hevery
tut0000021-hevery
 
Rock Solid Deployment of Web Applications
Rock Solid Deployment of Web ApplicationsRock Solid Deployment of Web Applications
Rock Solid Deployment of Web Applications
 
Architecture & Workflow of Modern Web Apps
Architecture & Workflow of Modern Web AppsArchitecture & Workflow of Modern Web Apps
Architecture & Workflow of Modern Web Apps
 
Jython on Django
Jython on DjangoJython on Django
Jython on Django
 
Plugin Development @ WordCamp Norway 2014
Plugin Development @ WordCamp Norway 2014Plugin Development @ WordCamp Norway 2014
Plugin Development @ WordCamp Norway 2014
 
Django Girls Tutorial
Django Girls TutorialDjango Girls Tutorial
Django Girls Tutorial
 
Browser Automated Testing Frameworks - Nightwatch.js
Browser Automated Testing Frameworks - Nightwatch.jsBrowser Automated Testing Frameworks - Nightwatch.js
Browser Automated Testing Frameworks - Nightwatch.js
 
Continuous Delivery for Front-End Engineers
Continuous Delivery for Front-End EngineersContinuous Delivery for Front-End Engineers
Continuous Delivery for Front-End Engineers
 
Spring Boot
Spring BootSpring Boot
Spring Boot
 

Mehr von MarcinStachniuk

GraphQL - Piękne API w Twojej Aplikacji - KrakowGraphAcademy
GraphQL - Piękne API w Twojej Aplikacji - KrakowGraphAcademyGraphQL - Piękne API w Twojej Aplikacji - KrakowGraphAcademy
GraphQL - Piękne API w Twojej Aplikacji - KrakowGraphAcademyMarcinStachniuk
 
Wroclaw GraphQL - GraphQL in Java
Wroclaw GraphQL - GraphQL in JavaWroclaw GraphQL - GraphQL in Java
Wroclaw GraphQL - GraphQL in JavaMarcinStachniuk
 
[DevCrowd] GraphQL - gdy API RESTowe to za mało
[DevCrowd] GraphQL - gdy API RESTowe to za mało[DevCrowd] GraphQL - gdy API RESTowe to za mało
[DevCrowd] GraphQL - gdy API RESTowe to za małoMarcinStachniuk
 
GraphQL - gdy API RESTowe to za mało
GraphQL - gdy API RESTowe to za małoGraphQL - gdy API RESTowe to za mało
GraphQL - gdy API RESTowe to za małoMarcinStachniuk
 
BruJUG Brussels GraphQL when RESR API is to less - lessons learned
BruJUG Brussels GraphQL when RESR API is to less - lessons learnedBruJUG Brussels GraphQL when RESR API is to less - lessons learned
BruJUG Brussels GraphQL when RESR API is to less - lessons learnedMarcinStachniuk
 
[WroclawJUG] Continuous Delivery in OSS using Shipkit
[WroclawJUG] Continuous Delivery in OSS using Shipkit[WroclawJUG] Continuous Delivery in OSS using Shipkit
[WroclawJUG] Continuous Delivery in OSS using ShipkitMarcinStachniuk
 
Continuous Delivery in OSS using Shipkit.org
Continuous Delivery in OSS using Shipkit.orgContinuous Delivery in OSS using Shipkit.org
Continuous Delivery in OSS using Shipkit.orgMarcinStachniuk
 
GraphQL - when REST API is to less - lessons learned
GraphQL - when REST API is to less - lessons learnedGraphQL - when REST API is to less - lessons learned
GraphQL - when REST API is to less - lessons learnedMarcinStachniuk
 
GraphQL - when REST API is to less - lessons learned
GraphQL - when REST API is to less - lessons learnedGraphQL - when REST API is to less - lessons learned
GraphQL - when REST API is to less - lessons learnedMarcinStachniuk
 
GraphQL - when REST API is to less - lessons learned
GraphQL - when REST API is to less - lessons learnedGraphQL - when REST API is to less - lessons learned
GraphQL - when REST API is to less - lessons learnedMarcinStachniuk
 
GraphQL - when REST API is to less - lessons learned
GraphQL - when REST API is to less - lessons learnedGraphQL - when REST API is to less - lessons learned
GraphQL - when REST API is to less - lessons learnedMarcinStachniuk
 
GraphQL - when REST API is to less - lessons learned
GraphQL - when REST API is to less - lessons learnedGraphQL - when REST API is to less - lessons learned
GraphQL - when REST API is to less - lessons learnedMarcinStachniuk
 
GraphQL - when REST API is to less - lessons learned
GraphQL - when REST API is to less - lessons learnedGraphQL - when REST API is to less - lessons learned
GraphQL - when REST API is to less - lessons learnedMarcinStachniuk
 
GraphQL - when REST API is not enough - lessons learned
GraphQL - when REST API is not enough - lessons learnedGraphQL - when REST API is not enough - lessons learned
GraphQL - when REST API is not enough - lessons learnedMarcinStachniuk
 
Java Web Start – jak żyć z tą dziwną technologią
Java Web Start – jak żyć z tą dziwną technologiąJava Web Start – jak żyć z tą dziwną technologią
Java Web Start – jak żyć z tą dziwną technologiąMarcinStachniuk
 
Zarządzanie zmianami w schemacie relacyjnych baz danych
Zarządzanie zmianami w schemacie relacyjnych baz danychZarządzanie zmianami w schemacie relacyjnych baz danych
Zarządzanie zmianami w schemacie relacyjnych baz danychMarcinStachniuk
 
Inicjatywa NoSQL na przykładzie db4o
Inicjatywa NoSQL na przykładzie db4oInicjatywa NoSQL na przykładzie db4o
Inicjatywa NoSQL na przykładzie db4oMarcinStachniuk
 
Automatic mechanism data migration between relational and object database
Automatic mechanism data migration between relational and object databaseAutomatic mechanism data migration between relational and object database
Automatic mechanism data migration between relational and object databaseMarcinStachniuk
 
Zastosowanie obiektowych baz danych na przykładzie db4o
Zastosowanie obiektowych baz danych na przykładzie db4oZastosowanie obiektowych baz danych na przykładzie db4o
Zastosowanie obiektowych baz danych na przykładzie db4oMarcinStachniuk
 

Mehr von MarcinStachniuk (20)

GraphQL - Piękne API w Twojej Aplikacji - KrakowGraphAcademy
GraphQL - Piękne API w Twojej Aplikacji - KrakowGraphAcademyGraphQL - Piękne API w Twojej Aplikacji - KrakowGraphAcademy
GraphQL - Piękne API w Twojej Aplikacji - KrakowGraphAcademy
 
Wroclaw GraphQL - GraphQL in Java
Wroclaw GraphQL - GraphQL in JavaWroclaw GraphQL - GraphQL in Java
Wroclaw GraphQL - GraphQL in Java
 
[DevCrowd] GraphQL - gdy API RESTowe to za mało
[DevCrowd] GraphQL - gdy API RESTowe to za mało[DevCrowd] GraphQL - gdy API RESTowe to za mało
[DevCrowd] GraphQL - gdy API RESTowe to za mało
 
GraphQL - gdy API RESTowe to za mało
GraphQL - gdy API RESTowe to za małoGraphQL - gdy API RESTowe to za mało
GraphQL - gdy API RESTowe to za mało
 
BruJUG Brussels GraphQL when RESR API is to less - lessons learned
BruJUG Brussels GraphQL when RESR API is to less - lessons learnedBruJUG Brussels GraphQL when RESR API is to less - lessons learned
BruJUG Brussels GraphQL when RESR API is to less - lessons learned
 
[WroclawJUG] Continuous Delivery in OSS using Shipkit
[WroclawJUG] Continuous Delivery in OSS using Shipkit[WroclawJUG] Continuous Delivery in OSS using Shipkit
[WroclawJUG] Continuous Delivery in OSS using Shipkit
 
Continuous Delivery in OSS using Shipkit.org
Continuous Delivery in OSS using Shipkit.orgContinuous Delivery in OSS using Shipkit.org
Continuous Delivery in OSS using Shipkit.org
 
GraphQL - when REST API is to less - lessons learned
GraphQL - when REST API is to less - lessons learnedGraphQL - when REST API is to less - lessons learned
GraphQL - when REST API is to less - lessons learned
 
GraphQL - when REST API is to less - lessons learned
GraphQL - when REST API is to less - lessons learnedGraphQL - when REST API is to less - lessons learned
GraphQL - when REST API is to less - lessons learned
 
GraphQL - when REST API is to less - lessons learned
GraphQL - when REST API is to less - lessons learnedGraphQL - when REST API is to less - lessons learned
GraphQL - when REST API is to less - lessons learned
 
GraphQL - when REST API is to less - lessons learned
GraphQL - when REST API is to less - lessons learnedGraphQL - when REST API is to less - lessons learned
GraphQL - when REST API is to less - lessons learned
 
GraphQL - when REST API is to less - lessons learned
GraphQL - when REST API is to less - lessons learnedGraphQL - when REST API is to less - lessons learned
GraphQL - when REST API is to less - lessons learned
 
GraphQL - when REST API is to less - lessons learned
GraphQL - when REST API is to less - lessons learnedGraphQL - when REST API is to less - lessons learned
GraphQL - when REST API is to less - lessons learned
 
GraphQL - when REST API is not enough - lessons learned
GraphQL - when REST API is not enough - lessons learnedGraphQL - when REST API is not enough - lessons learned
GraphQL - when REST API is not enough - lessons learned
 
Java Web Start – jak żyć z tą dziwną technologią
Java Web Start – jak żyć z tą dziwną technologiąJava Web Start – jak żyć z tą dziwną technologią
Java Web Start – jak żyć z tą dziwną technologią
 
Zarządzanie zmianami w schemacie relacyjnych baz danych
Zarządzanie zmianami w schemacie relacyjnych baz danychZarządzanie zmianami w schemacie relacyjnych baz danych
Zarządzanie zmianami w schemacie relacyjnych baz danych
 
Inicjatywa NoSQL na przykładzie db4o
Inicjatywa NoSQL na przykładzie db4oInicjatywa NoSQL na przykładzie db4o
Inicjatywa NoSQL na przykładzie db4o
 
Automatic mechanism data migration between relational and object database
Automatic mechanism data migration between relational and object databaseAutomatic mechanism data migration between relational and object database
Automatic mechanism data migration between relational and object database
 
Zastosowanie obiektowych baz danych na przykładzie db4o
Zastosowanie obiektowych baz danych na przykładzie db4oZastosowanie obiektowych baz danych na przykładzie db4o
Zastosowanie obiektowych baz danych na przykładzie db4o
 
Wprowadzenie do J2ME
Wprowadzenie do J2MEWprowadzenie do J2ME
Wprowadzenie do J2ME
 

Kürzlich hochgeladen

Automate your Kamailio Test Calls - Kamailio World 2024
Automate your Kamailio Test Calls - Kamailio World 2024Automate your Kamailio Test Calls - Kamailio World 2024
Automate your Kamailio Test Calls - Kamailio World 2024Andreas Granig
 
Alfresco TTL#157 - Troubleshooting Made Easy: Deciphering Alfresco mTLS Confi...
Alfresco TTL#157 - Troubleshooting Made Easy: Deciphering Alfresco mTLS Confi...Alfresco TTL#157 - Troubleshooting Made Easy: Deciphering Alfresco mTLS Confi...
Alfresco TTL#157 - Troubleshooting Made Easy: Deciphering Alfresco mTLS Confi...Angel Borroy López
 
Best Web Development Agency- Idiosys USA.pdf
Best Web Development Agency- Idiosys USA.pdfBest Web Development Agency- Idiosys USA.pdf
Best Web Development Agency- Idiosys USA.pdfIdiosysTechnologies1
 
Building a General PDE Solving Framework with Symbolic-Numeric Scientific Mac...
Building a General PDE Solving Framework with Symbolic-Numeric Scientific Mac...Building a General PDE Solving Framework with Symbolic-Numeric Scientific Mac...
Building a General PDE Solving Framework with Symbolic-Numeric Scientific Mac...stazi3110
 
Open Source Summit NA 2024: Open Source Cloud Costs - OpenCost's Impact on En...
Open Source Summit NA 2024: Open Source Cloud Costs - OpenCost's Impact on En...Open Source Summit NA 2024: Open Source Cloud Costs - OpenCost's Impact on En...
Open Source Summit NA 2024: Open Source Cloud Costs - OpenCost's Impact on En...Matt Ray
 
Buds n Tech IT Solutions: Top-Notch Web Services in Noida
Buds n Tech IT Solutions: Top-Notch Web Services in NoidaBuds n Tech IT Solutions: Top-Notch Web Services in Noida
Buds n Tech IT Solutions: Top-Notch Web Services in Noidabntitsolutionsrishis
 
Balasore Best It Company|| Top 10 IT Company || Balasore Software company Odisha
Balasore Best It Company|| Top 10 IT Company || Balasore Software company OdishaBalasore Best It Company|| Top 10 IT Company || Balasore Software company Odisha
Balasore Best It Company|| Top 10 IT Company || Balasore Software company Odishasmiwainfosol
 
Odoo 14 - eLearning Module In Odoo 14 Enterprise
Odoo 14 - eLearning Module In Odoo 14 EnterpriseOdoo 14 - eLearning Module In Odoo 14 Enterprise
Odoo 14 - eLearning Module In Odoo 14 Enterprisepreethippts
 
React Server Component in Next.js by Hanief Utama
React Server Component in Next.js by Hanief UtamaReact Server Component in Next.js by Hanief Utama
React Server Component in Next.js by Hanief UtamaHanief Utama
 
Implementing Zero Trust strategy with Azure
Implementing Zero Trust strategy with AzureImplementing Zero Trust strategy with Azure
Implementing Zero Trust strategy with AzureDinusha Kumarasiri
 
Cyber security and its impact on E commerce
Cyber security and its impact on E commerceCyber security and its impact on E commerce
Cyber security and its impact on E commercemanigoyal112
 
Ahmed Motair CV April 2024 (Senior SW Developer)
Ahmed Motair CV April 2024 (Senior SW Developer)Ahmed Motair CV April 2024 (Senior SW Developer)
Ahmed Motair CV April 2024 (Senior SW Developer)Ahmed Mater
 
Catch the Wave: SAP Event-Driven and Data Streaming for the Intelligence Ente...
Catch the Wave: SAP Event-Driven and Data Streaming for the Intelligence Ente...Catch the Wave: SAP Event-Driven and Data Streaming for the Intelligence Ente...
Catch the Wave: SAP Event-Driven and Data Streaming for the Intelligence Ente...confluent
 
Introduction Computer Science - Software Design.pdf
Introduction Computer Science - Software Design.pdfIntroduction Computer Science - Software Design.pdf
Introduction Computer Science - Software Design.pdfFerryKemperman
 
Folding Cheat Sheet #4 - fourth in a series
Folding Cheat Sheet #4 - fourth in a seriesFolding Cheat Sheet #4 - fourth in a series
Folding Cheat Sheet #4 - fourth in a seriesPhilip Schwarz
 
Software Project Health Check: Best Practices and Techniques for Your Product...
Software Project Health Check: Best Practices and Techniques for Your Product...Software Project Health Check: Best Practices and Techniques for Your Product...
Software Project Health Check: Best Practices and Techniques for Your Product...Velvetech LLC
 
BATTLEFIELD ORM: TIPS, TACTICS AND STRATEGIES FOR CONQUERING YOUR DATABASE
BATTLEFIELD ORM: TIPS, TACTICS AND STRATEGIES FOR CONQUERING YOUR DATABASEBATTLEFIELD ORM: TIPS, TACTICS AND STRATEGIES FOR CONQUERING YOUR DATABASE
BATTLEFIELD ORM: TIPS, TACTICS AND STRATEGIES FOR CONQUERING YOUR DATABASEOrtus Solutions, Corp
 

Kürzlich hochgeladen (20)

Automate your Kamailio Test Calls - Kamailio World 2024
Automate your Kamailio Test Calls - Kamailio World 2024Automate your Kamailio Test Calls - Kamailio World 2024
Automate your Kamailio Test Calls - Kamailio World 2024
 
Alfresco TTL#157 - Troubleshooting Made Easy: Deciphering Alfresco mTLS Confi...
Alfresco TTL#157 - Troubleshooting Made Easy: Deciphering Alfresco mTLS Confi...Alfresco TTL#157 - Troubleshooting Made Easy: Deciphering Alfresco mTLS Confi...
Alfresco TTL#157 - Troubleshooting Made Easy: Deciphering Alfresco mTLS Confi...
 
Best Web Development Agency- Idiosys USA.pdf
Best Web Development Agency- Idiosys USA.pdfBest Web Development Agency- Idiosys USA.pdf
Best Web Development Agency- Idiosys USA.pdf
 
2.pdf Ejercicios de programación competitiva
2.pdf Ejercicios de programación competitiva2.pdf Ejercicios de programación competitiva
2.pdf Ejercicios de programación competitiva
 
Building a General PDE Solving Framework with Symbolic-Numeric Scientific Mac...
Building a General PDE Solving Framework with Symbolic-Numeric Scientific Mac...Building a General PDE Solving Framework with Symbolic-Numeric Scientific Mac...
Building a General PDE Solving Framework with Symbolic-Numeric Scientific Mac...
 
Hot Sexy call girls in Patel Nagar🔝 9953056974 🔝 escort Service
Hot Sexy call girls in Patel Nagar🔝 9953056974 🔝 escort ServiceHot Sexy call girls in Patel Nagar🔝 9953056974 🔝 escort Service
Hot Sexy call girls in Patel Nagar🔝 9953056974 🔝 escort Service
 
Open Source Summit NA 2024: Open Source Cloud Costs - OpenCost's Impact on En...
Open Source Summit NA 2024: Open Source Cloud Costs - OpenCost's Impact on En...Open Source Summit NA 2024: Open Source Cloud Costs - OpenCost's Impact on En...
Open Source Summit NA 2024: Open Source Cloud Costs - OpenCost's Impact on En...
 
Buds n Tech IT Solutions: Top-Notch Web Services in Noida
Buds n Tech IT Solutions: Top-Notch Web Services in NoidaBuds n Tech IT Solutions: Top-Notch Web Services in Noida
Buds n Tech IT Solutions: Top-Notch Web Services in Noida
 
Balasore Best It Company|| Top 10 IT Company || Balasore Software company Odisha
Balasore Best It Company|| Top 10 IT Company || Balasore Software company OdishaBalasore Best It Company|| Top 10 IT Company || Balasore Software company Odisha
Balasore Best It Company|| Top 10 IT Company || Balasore Software company Odisha
 
Advantages of Odoo ERP 17 for Your Business
Advantages of Odoo ERP 17 for Your BusinessAdvantages of Odoo ERP 17 for Your Business
Advantages of Odoo ERP 17 for Your Business
 
Odoo 14 - eLearning Module In Odoo 14 Enterprise
Odoo 14 - eLearning Module In Odoo 14 EnterpriseOdoo 14 - eLearning Module In Odoo 14 Enterprise
Odoo 14 - eLearning Module In Odoo 14 Enterprise
 
React Server Component in Next.js by Hanief Utama
React Server Component in Next.js by Hanief UtamaReact Server Component in Next.js by Hanief Utama
React Server Component in Next.js by Hanief Utama
 
Implementing Zero Trust strategy with Azure
Implementing Zero Trust strategy with AzureImplementing Zero Trust strategy with Azure
Implementing Zero Trust strategy with Azure
 
Cyber security and its impact on E commerce
Cyber security and its impact on E commerceCyber security and its impact on E commerce
Cyber security and its impact on E commerce
 
Ahmed Motair CV April 2024 (Senior SW Developer)
Ahmed Motair CV April 2024 (Senior SW Developer)Ahmed Motair CV April 2024 (Senior SW Developer)
Ahmed Motair CV April 2024 (Senior SW Developer)
 
Catch the Wave: SAP Event-Driven and Data Streaming for the Intelligence Ente...
Catch the Wave: SAP Event-Driven and Data Streaming for the Intelligence Ente...Catch the Wave: SAP Event-Driven and Data Streaming for the Intelligence Ente...
Catch the Wave: SAP Event-Driven and Data Streaming for the Intelligence Ente...
 
Introduction Computer Science - Software Design.pdf
Introduction Computer Science - Software Design.pdfIntroduction Computer Science - Software Design.pdf
Introduction Computer Science - Software Design.pdf
 
Folding Cheat Sheet #4 - fourth in a series
Folding Cheat Sheet #4 - fourth in a seriesFolding Cheat Sheet #4 - fourth in a series
Folding Cheat Sheet #4 - fourth in a series
 
Software Project Health Check: Best Practices and Techniques for Your Product...
Software Project Health Check: Best Practices and Techniques for Your Product...Software Project Health Check: Best Practices and Techniques for Your Product...
Software Project Health Check: Best Practices and Techniques for Your Product...
 
BATTLEFIELD ORM: TIPS, TACTICS AND STRATEGIES FOR CONQUERING YOUR DATABASE
BATTLEFIELD ORM: TIPS, TACTICS AND STRATEGIES FOR CONQUERING YOUR DATABASEBATTLEFIELD ORM: TIPS, TACTICS AND STRATEGIES FOR CONQUERING YOUR DATABASE
BATTLEFIELD ORM: TIPS, TACTICS AND STRATEGIES FOR CONQUERING YOUR DATABASE
 

Java Web Start czyli jak żyć z tą dziwną technologią? & Continuous Delivery w projekcie Open Source - Marcin Stachniuk JUG Łódź

  • 1. Java Web Start czyli jak żyć z tą dziwną technologią? & Continuous Delivery w projekcie Open Source Marcin Stachniuk @MarcinStachniuk mstachniuk.blogspot.com JUG Łódź 20.04.2017
  • 2. O mnie ● Marcin Stachniuk ● Twitter: @MarcinStachniuk ● Blog: mstachniuk.blogspot.com ● WrocJUG ● Recenzent książki Practical Unit Testing ● Speker na konferencjach: 33rd degree 4 charity, dbconf.pl, warsjawa.pl, devcrowd.pl, chamberconf.pl, careercon.pl, itcareersummit.pl ● Mockito release tools team member ● Chorąży na ChamberConf
  • 3.
  • 5. Agenda ● Introduction ● Build Pipeline ● Continuous Integration ● Continuous Delivery ● Code Quality ● Nice Badges ● Promotion in the Internet ● Alternatives ● Q&A ● Bonuses ● What is Java Web Start? ● How it works? ● What can go wrong? ● Solution ● How does IceBoar works? ● Benefits ● Q&A
  • 6. Agenda ● Introduction ● Build Pipeline ● Continuous Integration ● Continuous Delivery ● Code Quality ● Nice Badges ● Promotion in the Internet ● Alternatives ● Q&A ● Bonuses ● What is Java Web Start? ● How it works? ● What can go wrong? ● Solution ● How does IceBoar works? ● Benefits ● Q&A +
  • 7. Agenda ● Introduction ● Build Pipeline ● Continuous Integration ● Continuous Delivery ● Code Quality ● Nice Badges ● Promotion in the Internet ● Alternatives ● Q&A ● Bonuses + ● What is Java Web Start? ● How it works? ● What can go wrong? ● Solution ● How does IceBoar works? ● Benefits ● Q&A
  • 8. Java Web Start – jak żyć z tą dziwną technologią? Marcin Stachniuk
  • 9. Java Platform Standard Edition 8 Documentation https://docs.oracle.com/javase/8/docs/
  • 10. Java Platform Tutorial: Swing https://docs.oracle.com/javase/tutorial/uiswing/components/text.html
  • 11. Example JNLP file <?xml version="1.0" encoding="utf-8"?> <!-- JNLP File for TextSamplerDemo --> <jnlp spec="1.0+" codebase="https://docs.oracle.com/javase/tutorialJWS/samples/uiswing/TextSamplerDemoProject" href="TextSamplerDemo.jnlp"> <information> <title>TextSamplerDemo</title> <vendor>The Java(tm) Tutorial</vendor> <homepage href="https://docs.oracle.com/javase/tutorial/uiswing/examples/components/index.html#TextSamplerDemo"/> <description>TextSamplerDemo</description> <description kind="short">Uses one of each of Swing's text components.</description> <offline-allowed/> </information> <resources> <j2se version="1.7+"/> <jar href="TextSamplerDemo.jar"/> </resources> <application-desc main-class="components.TextSamplerDemo"/> </jnlp>
  • 12. Java Web Start Sequence Diagram
  • 13. Java Web Start Sequence Diagram click
  • 14. Java Web Start Sequence Diagram click download
  • 15. Java Web Start Sequence Diagram click download run
  • 16. Java Web Start Sequence Diagram click download run are you sure?
  • 17. Java Web Start Sequence Diagram click download run are you sure? download JARs
  • 18. Java Web Start Sequence Diagram run application on javaws click download run are you sure? download JARs
  • 19. Java Web Start Sequence Diagram run application on javaws click download run are you sure? download JARs
  • 20. What could possibly go wrong? In JNLP: <j2se version="1.7"/> User: Java 1.8
  • 21. What could possibly go wrong? ● Different Java versions installed on client machines ● Sometimes javaws wants download and install latest JRE version ● Different behavior depending on Operating System and installed JRE version ● From some point of time apps needs to signed (Self-signed are blocked) ● Application started in sandbox (javaws or jp2launcher)
  • 30. How IceBoar works? click download run are you sure? download & run
  • 31. How IceBoar works? click download run are you sure? download & run download JRE
  • 32. How IceBoar works? click download run are you sure? download & run download JRE download JARs
  • 33. How IceBoar works? click download run are you sure? download & run download JRE download JARs run on our JRE
  • 34. How IceBoar works? click download run are you sure? download & run download JRE download JARs run on our JRE
  • 35. How IceBoar works? click download run are you sure? download & run download JRE download JARs run on our JRE
  • 36. Demo
  • 37. Profits ● We know a target JVM version ● Application start outside a sandbox (java instead of javaws) ● We sign only IceBoar jar ● Users don’t need admin rights to install JRE
  • 38. How to introduce IceBoar into a project? <dependency> <groupId>com.roche</groupId> <artifactId>ice-boar</artifactId> <version>${project.version}</version> <classifier>jar-with-dependencies</classifier> </dependency>
  • 39. How to introduce IceBoar into a project? <jnlp spec="1.0+" codebase="${codebase}"> <information> .... </information> <security> <all-permissions/> </security> <resources> <j2se version="1.5+" href="http://java.sun.com/products/autodl/j2se"/> <jar href="${jre.and.jars.host}/${jars.path}/ice-boar-1.0-jar-with-dependencies.jar"/> <property name="jnlp.IceBoar.close-on-end" value="false"/> <property name="jnlp.IceBoar.main-class" value="com.roche.iceboar.helloworldswing.HelloWorld"/> <property name="jnlp.IceBoar.jar.0" value="${jre.and.jars.host}/${jars.path}/ice-boar-hello-world-swing-${version}-jar-with-dependencies.jar"/> <property name="jnlp.IceBoar.splash" value="${jre.and.jars.host}/img/ice-boar-splash.png"/> </resources> <application-desc main-class="com.roche.iceboar.IceBoar"> </application-desc> </jnlp>
  • 41. Other features of IceBoar? ● Custom splash screen during loading ● No frame around splash screen ● Custom title and icon ● Starting application using pre-installed JRE ● Cache for downloaded JRE (for slow connections) ● Window with logs output ● Disable auto closing IceBoar window after starting target application
  • 44. Continuous Delivery Vs. Continuous Deployment
  • 45. Continuous Delivery Vs. Continuous Deployment https://puppet.com/blog/continuous-delivery-vs-continuous-deployment-what-s-diff
  • 46. Inspiration JDD2014: Continuous Delivery: Capitalizing High Quality Automated Tests (Sz. Faber) https://www.youtube.com/watch?v=Lda4RuQDQN0
  • 52. Continuous Delivery </> 1 git push 2 webhook build
  • 53. Continuous Delivery </> 1 git push 2 webhook build 3 deploy release snapshot
  • 54. Continuous Delivery </> 1 git push 2 webhook build 3 deploy release snapshot 4 commit to gh-pages
  • 55. Continuous Delivery </> 1 git push 2 webhook build 3 deploy release snapshot 4 commit to gh-pages 5 update gh-pages
  • 56. Continuous Delivery </> 1 git push 2 webhook build 3 deploy release snapshot 6 code coverage 4 commit to gh-pages 5 update gh-pages
  • 57. Continuous Delivery </> 1 git push 2 webhook build 3 deploy release snapshot 6 code coverage 7 sing & publish (manual) 4 commit to gh-pages 5 update gh-pages
  • 58. Continuous Delivery Deployment </> 1 git push 2 webhook build 3 deploy release snapshot 6 code coverage 7 sing & publish (manual) 4 commit to gh-pages 5 update gh-pages 7 sing & publish auto not implemented dream
  • 60. Continuous Integration https://travis-ci.org ● Free for Open Source Projects ● Easy setup with GitHub ● Container based architecture (Doker) ● Stateless
  • 61. Continuous Integration https://travis-ci.org ● Free for Open Source Projects ● Easy setup with GitHub ● Container based architecture (Doker) ● Stateless ● Multi language support (ANDROID, C, C#, C++, CLOJURE, CRYSTAL, D, DART, ERLANG, ELIXIR, F#, GO, GROOVY, HASKELL, HAXE, JAVA, JAVASCRIPT (WITH NODE.JS), JULIA, OBJECTIVE-C, PERL, PERL6, PHP, PYTHON, R, RUBY, RUST, SCALA, SMALLTALK, VISUAL BASIC) ● For Java: Oracle JDK 7 (default), Oracle JDK 8, OpenJDK 6, OpenJDK 7, Gradle 2.0, Maven 3.2 and Ant 1.8 ● Notifications via: Slack, HipChat, Emails and more
  • 62. How to set up Travis-CI .travis.yml language: java script: mvn clean install jdk: - oraclejdk8 ● Sign in to travis-ci.org using GitHub account ● Choose project (you need to have admin rights to this project) ● Add .travis.yml to your root project folder
  • 63. Default Travis-CI java build .travis.yml language: java jdk: - oraclejdk8 .travis.yml language: java install: mvn install -DskipTests=true -Dmaven.javadoc.skip=true -B -V script: mvn test -B jdk: - oraclejdk8 Default Travis-CI maven build seps: ● install ● script
  • 64. Default Travis-CI java build .travis.yml language: java jdk: - oraclejdk8 .travis.yml language: java install: mvn install -DskipTests=true -Dmaven.javadoc.skip=true -B -V script: mvn test -B jdk: - oraclejdk8 Default Travis-CI maven build seps: ● install ● script
  • 65. Default Travis-CI java build .travis.yml language: java jdk: - oraclejdk8 .travis.yml language: java install: mvn install -DskipTests=true -Dmaven.javadoc.skip=true -B -V script: mvn test -B jdk: - oraclejdk8 Default Travis-CI maven build seps: ● install ● script
  • 66. Store sensitive data (passwords) on travis-ci <settings ...> <servers> <server> <id>bintray-stachnim-IceBoar</id> <username>${env.CI_DEPLOY_USERNAME}</username> <password>${env.CI_DEPLOY_PASSWORD}</password> </server> settings.xml
  • 67. Store sensitive data (passwords) on travis-ci
  • 68. Store sensitive data (passwords) on travis-ci
  • 69. Current IceBoar Build in nutshell #!/bin/bash set -ev if [ "${TRAVIS_PULL_REQUEST}" = "false" ]; then cd ice-boar && mvn clean deploy --settings … else cd ice-boar && mvn clean install && ... fi build-travis.sh language: java script: ./build-travis.sh jdk: - oraclejdk8 .travis.yml
  • 71. Release artifact to Maven Central is not so easy ● Hard to sign in / create account (need to find link and create an issue) ● Manual verification of uploaded artifact
  • 72. Release artifact to Maven Central is not so easy Complicated Requirements: ● Supply Javadoc and Sources ● Sign Files with GPG/PGP ● Sufficient Metadata (pom file) ● Correct Coordinates (groupId, artifactId, version) ● Project Name, Description and URL ● License Information ● Developer Information ● SCM Information
  • 73. Release artifact to bintray ● Sign in with GitHub ● Add new package to maven repository, configure it ● Deploy to bintray (from Travis-CI) ● You don’t need to sign your artifact
  • 75. Bintray deploy to Maven Central ● You can’t store user token password :-( ● This will be manual step :-(
  • 76. Google Developers: The Secret to Safe Continuous Deployment www.youtube.com/watch?v=UMnZiTL0tUc github.com/bslatkin/dpxdt
  • 78. Code Quality with codecov.io ● Sign in to codecov.io with GitHub ● Configure jacoco-maven-plugin ● Add to .travis.yml: language: java script: ./build-travis.sh jdk: - oraclejdk8 before_install: - pip install --user codecov after_success: - codecov .travis.yml
  • 79. Codecov see Code Coverage
  • 80. Codecov Extension (for Chrome) - see coverage on GitHub https://chrome.google.com/webstore/detail/codecov-extension/
  • 82. IceBoar build in details
  • 83. IceBoar project structure in details Roche/IceBoar pom.xml (project name: ice-boar-build) ice-boar (without reference to parent pom) ice-boar-samples ice-boar-demo-gh-pages ice-boar-demo ice-boar-hello-world-swing
  • 84. Current IceBoar Build in details language: java script: ./build-travis.sh jdk: - oraclejdk8 before_install: - pip install --user codecov after_success: - codecov cache: directories: - $HOME/.m2 // cache dir between builds install: true // skip install script .travis.yml
  • 85. Current IceBoar Build in details #!/bin/bash set -ev if [ "${TRAVIS_PULL_REQUEST}" = "false" ]; then ... else cd ice-boar mvn clean install cd .. mvn clean install -U fi build-travis.sh set -ev -e fail fast -v print all lines in the script before executing them
  • 86. Current IceBoar Build in details cd ice-boar mvn clean deploy --settings settings.xml cd .. mvn clean install -U cd ice-boar-samples/ice-boar-demo-gh-pages/ mvn clean install -P ghpages git clone https://github.com/Roche/IceBoar cd IceBoar git checkout gh-pages && cp -R ../target/ice-boar-demo-gh-pages/* . build-travis.sh Roche/IceBoar ice-boar ice-boar-samples ice-boar-demo-gh-pages ice-boar-demo ice-boar-hello-world-swing
  • 87. Current IceBoar Build in details cd ice-boar mvn clean deploy --settings settings.xml cd .. mvn clean install -U cd ice-boar-samples/ice-boar-demo-gh-pages/ mvn clean install -P ghpages git clone https://github.com/Roche/IceBoar cd IceBoar git checkout gh-pages && cp -R ../target/ice-boar-demo-gh-pages/* . build-travis.sh Roche/IceBoar ice-boar ice-boar-samples ice-boar-demo-gh-pages ice-boar-demo ice-boar-hello-world-swing
  • 88. Current IceBoar Build in details cd ice-boar mvn clean deploy --settings settings.xml cd .. mvn clean install -U cd ice-boar-samples/ice-boar-demo-gh-pages/ mvn clean install -P ghpages git clone https://github.com/Roche/IceBoar cd IceBoar git checkout gh-pages && cp -R ../target/ice-boar-demo-gh-pages/* . build-travis.sh Roche/IceBoar ice-boar ice-boar-samples ice-boar-demo-gh-pages ice-boar-demo ice-boar-hello-world-swing
  • 89. Current IceBoar Build in details cd ice-boar mvn clean deploy --settings settings.xml cd .. mvn clean install -U cd ice-boar-samples/ice-boar-demo-gh-pages/ mvn clean install -P ghpages git clone https://github.com/Roche/IceBoar cd IceBoar git checkout gh-pages && cp -R ../target/ice-boar-demo-gh-pages/* . build-travis.sh Roche/IceBoar ice-boar ice-boar-samples ice-boar-demo-gh-pages ice-boar-demo ice-boar-hello-world-swing IceBoar
  • 90. Current IceBoar Build in details cd ice-boar mvn clean deploy --settings settings.xml cd .. mvn clean install -U cd ice-boar-samples/ice-boar-demo-gh-pages/ mvn clean install -P ghpages git clone https://github.com/Roche/IceBoar cd IceBoar git checkout gh-pages && cp -R ../target/ice-boar-demo-gh-pages/* . build-travis.sh Roche/IceBoar ice-boar ice-boar-samples ice-boar-demo-gh-pages ice-boar-demo ice-boar-hello-world-swing IceBoar
  • 91. Current IceBoar Build in details git config user.name "Marcin Stachniuk" git config user.email mstachniuk@...com git add -A git commit -m "update gh-pages by Travis-CI" git push ${GIT_HUB_REPO_SECRET} build-travis.sh Roche/IceBoar ice-boar ice-boar-samples ice-boar-demo-gh-pages ice-boar-demo ice-boar-hello-world-swing IceBoar
  • 95. What is important for users? ● Nice demo page with example usage: roche.github.io/IceBoar/
  • 96. What is important for users? ● Easy setup for contributors
  • 97. What is important for promotion? ● Stack Overflow: stackoverflow.com/search?q=ice+boar
  • 98. How to promote in the Internet? ● Blogposts ● Another forums, groups, etc. ● Hackergarten (1 Pull Request,1 commit, 2 contributors) ● Presentations at JUG’s and conferences ● Coding in train (1 Pull Request, 16 commits, 1 contributor)
  • 100. Alternatives to Travic-CI ● gitlab.com ● BitBucket host in the cloud ● teamcity.codebetter.com/login.html ● teamcity.jetbrains.com ● www.appveyor.com (for .NET) ● scrutinizer-ci.com (+ code metrics) ● codeship.com (run Docker’s, support for: Ruby (Rails), Node.js, PHP, Python, Java, Go) ● magnum-ci.com (+ code metrics) ● circleci.com ● www.visualstudio.com/en-us/products/visual-studio-team-services-vs.aspx ● app.shippable.com (support for Ruby, Python, Java, Node.js, Scala, PHP, Clojure, Go) ● www.snap-ci.com (by ThoughtWorks)
  • 101. Alternatives for codecov.io ● coveralls.io ● nemo.sonarqube.org (BETA - need to write an e-mail on e-mail list for account) ● sonar.qatools.ru ● coverity.com (for: C, C++, C#, Java) ● www.codacy.com (for Scala, Ruby, Java, JavaScript, Python, Php)
  • 103. Bonus
  • 104. LuxLekarz - LuxMed + ZnanyLekarz github.com/mstachniuk/LuxLekarz
  • 106. Mockito Release Tools Vision github.com/mockito/mockito-release-tools ● Easy setup ● Auto generation of release notes (notable and regular) ● Include contributors in pom.xml ● Auto update releases on GitHub ● CI create git tag, update release notes in repository, bump version ● Release artifacts only when binary was changed ● Million of users ;-)
  • 108. Links ● https://puppet.com/blog/continuous-delivery-vs-continuous-deployment-what-s-diff Continuous Delivery Vs. Continuous Deployment: What's the Diff? ● https://www.youtube.com/watch?v=Lda4RuQDQN0 Szczepan Faber about Continuous Delivery ● https://docs.oracle.com/javase/8/docs/ Java Platform Standard Edition 8 Documentation ● https://github.com/Roche/IceBoar IceBoar on GitHub ● https://github.com GitHub Source Code repository ● https://github.io GitHub Pages ● https://travis-ci.org Travis-CI Continuous Integration Server ● https://codecov.io Collect your code coverage ● https://bintray.com Popular repository for your artifacts (not only Jar files) ● https://oss.jfrog.org Repository for OSS snapshots ● https://search.maven.org The Maven Central ● https://docs.travis-ci.com/user/pull-requests#Security-Restrictions-when-testing-Pull-Requests Why sometimes PR from fork fail on Travis-Ci ● http://central.sonatype.org/pages/requirements.html Requirements for release in to Maven Central ● https://issues.sonatype.org Create issue for new account on Maven Central ● https://www.youtube.com/watch?v=UMnZiTL0tUc Google Developers The Secret to Safe Continuous Deployment ● https://chrome.google.com/webstore/detail/codecov-extension Codecov extension (for Google Chrome) ● http://shields.io Nice badges generator ● https://roche.github.io/IceBoar Demo page for IceBoar ● http://stackoverflow.com/search?q=ice+boar IceBoar on Stack Overflow
  • 109. Java Web Start czyli jak żyć z tą dziwną technologią? & Continuous Delivery w projekcie Open Source Marcin Stachniuk @MarcinStachniuk mstachniuk.blogspot.com JUG Łódź 20.04.2017 Dziękuję!