<?xml version="1.0" encoding="utf-8"?>
<feed xmlns="http://www.w3.org/2005/Atom"><title>The Wombelix Post - Java</title><link href="https://dominik.wombacher.cc/" rel="alternate"/><link href="/feeds/tag_java.atom.xml" rel="self"/><id>https://dominik.wombacher.cc/</id><updated>2025-08-02T00:00:00+02:00</updated><entry><title>Modernizing jDeepL: Java 11 to 17 and Automated Releases</title><link href="https://dominik.wombacher.cc/posts/modernizing-jdeepl-java-11-to-17-and-automated-releases.html" rel="alternate"/><published>2025-08-02T00:00:00+02:00</published><updated>2025-08-02T00:00:00+02:00</updated><author><name>Dominik Wombacher</name></author><id>tag:dominik.wombacher.cc,2025-08-02:/posts/modernizing-jdeepl-java-11-to-17-and-automated-releases.html</id><summary type="html">&lt;!-- SPDX-FileCopyrightText: 2025 Dominik Wombacher &lt;dominik@wombacher.cc&gt; --&gt;
&lt;!--  --&gt;
&lt;!-- SPDX-License-Identifier: CC-BY-SA-4.0 --&gt;
&lt;p&gt;I had some time last night - the neighbors were having a
party and I couldn't sleep - so I decided to tackle a task
that's been sitting in my backlog for  ... &lt;a class="read-more" href="/posts/modernizing-jdeepl-java-11-to-17-and-automated-releases.html"&gt; [read more]&lt;/a&gt;&lt;/p&gt;</summary><content type="html">&lt;!-- SPDX-FileCopyrightText: 2025 Dominik Wombacher &lt;dominik@wombacher.cc&gt; --&gt;
&lt;!--  --&gt;
&lt;!-- SPDX-License-Identifier: CC-BY-SA-4.0 --&gt;
&lt;p&gt;I had some time last night - the neighbors were having a
party and I couldn't sleep - so I decided to tackle a task
that's been sitting in my backlog for way too long: modernizing
jDeepL, my &lt;a class="reference external" href="https://dominik.wombacher.cc/posts/jdeepl_unofficial_deepl_app_for_linux_based_on_javafx.html"&gt;unofficial DeepL translation app for Linux&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;For those who don't know jDeepL, it's a simple JavaFX desktop
application that lets you translate text using the DeepL API. Nothing
fancy, just a basic GUI with source and target text areas, language
selection, and the CTRL+C+C keyboard shortcut for quick translations.
I built it because I wanted something native on Linux instead of using
the web interface all the time.&lt;/p&gt;
&lt;p&gt;The main problem was that the project was stuck on older dependencies
and had practically non-existent documentation. This became obvious
when people opened and commented &lt;a class="reference external" href="https://github.com/wombelix/jDeepL/issues/1"&gt;GitHub issue #1&lt;/a&gt;
back in March 2023. Around that time jDeepL was also mentioned in a Golem.de
Article and I received a couple of Emails. All pointing out that there wasn't
much instruction on how to build it and that they ran into compatibility
issues with newer Java versions. The project was using Java 11, JavaFX 11, and
a bunch of outdated libraries that caused build failures for anyone
trying to compile from source.&lt;/p&gt;
&lt;p&gt;So last night I finally decided to modernize the whole thing a bit. The work
took me a few hours of checking new versions, reading changelogs, and
validating that updates wouldn't break anything. I bumped Java from 11
to 17 and updated all dependencies to their latest stable releases. So,
same libraries I was already using, but brought up to current versions.&lt;/p&gt;
&lt;p&gt;The most interesting challenge was fixing the FXTrayIcon dependency.
It had a deprecated constructor that I was using, so I had to dig into
the &lt;a class="reference external" href="https://github.com/dustinkredmond/FXTrayIcon"&gt;library's source code&lt;/a&gt;
to understand what the deprecated builder actually did and how to achieve
the same result with non-deprecated methods. The old approach let you define
image scaling directly in the constructor. The new way requires a two-step
approach: use the builder pattern, then call the image scaling method on the
returned object. Small change, but it took some detective work to
figure out the right replacement.&lt;/p&gt;
&lt;p&gt;The documentation also needed some love. The README was more or less
just a description of what the app does, with not much information
about how to actually build or run it. I added a Quick Start section
and expanded the Build section with Maven setup instructions. More
importantly, I set up automated releases using GitHub Actions.&lt;/p&gt;
&lt;p&gt;This is actually a huge step forward compared to how I handled releases
before. Back in &lt;a class="reference external" href="https://dominik.wombacher.cc/posts/jdeepl-version-0-7-4-released-pre-build-binaries-available.html"&gt;version 0.7.4&lt;/a&gt;, I was manually
uploading pre-built JARs to my personal Nextcloud instance. This
worked fine and was documented in the README, but wasn't exactly
convenient. Now when I push a tag, the
&lt;a class="reference external" href="https://git.sr.ht/~wombelix/jDeepL/tree/main/item/.github/workflows/release.yml"&gt;GitHub Actions workflow&lt;/a&gt;
automatically builds the JAR and creates a GitHub release with the
file attached. Users can just go to the
&lt;a class="reference external" href="https://github.com/wombelix/jDeepL/releases"&gt;GitHub releases page&lt;/a&gt;
and download binaries instead of having to build from source.&lt;/p&gt;
&lt;p&gt;One thing I discovered during this modernization is that jnativehook,
the library I use for the global &lt;code&gt;CTRL+C+C&lt;/code&gt; hotkey, is likely
on its way to becoming unmaintained. It only works with X11 sessions,
and with bleeding-edge distros pushing toward Wayland, I might need
to find a different approach for hotkey handling in a few years. But
that's a problem for future me.&lt;/p&gt;
&lt;p&gt;The project now builds with Java 17, uses updated dependencies, has
expanded documentation, and automated releases. The original issue
about build problems should be resolved now. Users can either download
pre-built JARs from GitHub releases or follow the updated build
instructions to compile from the
&lt;a class="reference external" href="https://git.sr.ht/~wombelix/jDeepL"&gt;source code&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;It wasn't groundbreaking work, overall just maintenance that was overdue.
But sometimes that's what projects need, a bit of attention to keep them
current and usable.&lt;/p&gt;
&lt;p&gt;Next, I'm thinking about creating OS-specific packages using &lt;code&gt;jpackage&lt;/code&gt;.
This would let me provide &lt;code&gt;.deb&lt;/code&gt; and &lt;code&gt;.rpm&lt;/code&gt; packages that ship
with all dependencies. This would make the usage even easier compared to the
current &lt;code&gt;JAR&lt;/code&gt; file approach.&lt;/p&gt;
</content><category term="Code"/><category term="DeepL"/><category term="Java"/><category term="JavaFX"/><category term="Linux"/><category term="GitHubActions"/></entry><entry><title>jDeepL version 0.7.4 released, pre-build binaries available</title><link href="https://dominik.wombacher.cc/posts/jdeepl-version-0-7-4-released-pre-build-binaries-available.html" rel="alternate"/><published>2023-11-01T00:00:00+01:00</published><updated>2023-11-01T00:00:00+01:00</updated><author><name>Dominik Wombacher</name></author><id>tag:dominik.wombacher.cc,2023-11-01:/posts/jdeepl-version-0-7-4-released-pre-build-binaries-available.html</id><summary type="html">&lt;!-- SPDX-FileCopyrightText: 2024 Dominik Wombacher &lt;dominik@wombacher.cc&gt; --&gt;
&lt;!--  --&gt;
&lt;!-- SPDX-License-Identifier: CC-BY-SA-4.0 --&gt;
&lt;p&gt;It's been a while since I announced and released the first version of
&lt;a class="reference external" href="https://dominik.wombacher.cc/posts/jdeepl_unofficial_deepl_app_for_linux_based_on_javafx.html"&gt;jDeepL - Unofficial DeepL App for Linux based on JavaFX&lt;/a&gt;.
Since then it was mentioned on a couple  ... &lt;a class="read-more" href="/posts/jdeepl-version-0-7-4-released-pre-build-binaries-available.html"&gt; [read more]&lt;/a&gt;&lt;/p&gt;</summary><content type="html">&lt;!-- SPDX-FileCopyrightText: 2024 Dominik Wombacher &lt;dominik@wombacher.cc&gt; --&gt;
&lt;!--  --&gt;
&lt;!-- SPDX-License-Identifier: CC-BY-SA-4.0 --&gt;
&lt;p&gt;It's been a while since I announced and released the first version of
&lt;a class="reference external" href="https://dominik.wombacher.cc/posts/jdeepl_unofficial_deepl_app_for_linux_based_on_javafx.html"&gt;jDeepL - Unofficial DeepL App for Linux based on JavaFX&lt;/a&gt;.
Since then it was mentioned on a couple of news sites and people reached out to me.
Mostly with pointing out that there are not much instructions how to build it.
And that I don't offer pre-build binaries that people can directly run.&lt;/p&gt;
&lt;p&gt;That was good and valid feedback. I was focused on sharing it with the world.
I didn't take into account that non-tech people are the actual users.&lt;/p&gt;
&lt;p&gt;As part of the recent
&lt;a class="reference external" href="https://dominik.wombacher.cc/posts/git-repos-moved-to-sourcehut-with-mirrors-on-codeberg-gitlab-and-github.html"&gt;Git repos moved to Sourcehut, with mirrors on Codeberg, GitLab and GitHub&lt;/a&gt;
activities, I allocated a bit of time to tackle some of the addressed issues.
The &lt;a class="reference external" href="https://git.sr.ht/~wombelix/jDeepL"&gt;README&lt;/a&gt; should now be a bit clearer.
I updated some dependencies, improved the release scripts and published
&lt;a class="reference external" href="https://git.sr.ht/~wombelix/jDeepL/commit/a0801cbde9f606aa4a23fe459c5682b7c68ed799"&gt;v0.7.4&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;For the future I plan a CI integration that takes care about publishing new versions.
Until then, I uploaded the pre-build version to  my personal Nextcloud instance: &lt;a class="reference external" href="https://hub.xlii.cc/s/an7E9E9bgFBpRG3"&gt;https://hub.xlii.cc/s/an7E9E9bgFBpRG3&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;Latest version: v0.7.4 (SHA256 checksum: 206c13ec820451096bdf07f29e336c6827c750db11554d9dcc68812c8b56c796)&lt;/p&gt;
&lt;p&gt;It's nice to see that some people find useful what I created.&lt;/p&gt;
</content><category term="Code"/><category term="DeepL"/><category term="Java"/><category term="JavaFX"/><category term="Linux"/></entry><entry><title>Second attempt to pass the Oracle 1Z0-819 Java SE 11 Developer Exam</title><link href="https://dominik.wombacher.cc/posts/second-attempt-to-pass-the-oracle-1z0-819-java-se-11-developer-exam.html" rel="alternate"/><published>2022-08-31T00:00:00+02:00</published><updated>2022-08-31T00:00:00+02:00</updated><author><name>Dominik Wombacher</name></author><id>tag:dominik.wombacher.cc,2022-08-31:/posts/second-attempt-to-pass-the-oracle-1z0-819-java-se-11-developer-exam.html</id><summary type="html">&lt;!-- SPDX-FileCopyrightText: 2023 Dominik Wombacher &lt;dominik@wombacher.cc&gt; --&gt;
&lt;!--  --&gt;
&lt;!-- SPDX-License-Identifier: CC-BY-SA-4.0 --&gt;
&lt;p&gt;I wrote about my first attempt
&lt;a class="reference external" href="https://dominik.wombacher.cc/posts/how-i-prepared-and-failed-the-1z0-819-java-se-11-developer-exam.html"&gt;last Year&lt;/a&gt;
and gave it a another try today, after preparing a lot throughout the last weeks,
but not as much as I actually  ... &lt;a class="read-more" href="/posts/second-attempt-to-pass-the-oracle-1z0-819-java-se-11-developer-exam.html"&gt; [read more]&lt;/a&gt;&lt;/p&gt;</summary><content type="html">&lt;!-- SPDX-FileCopyrightText: 2023 Dominik Wombacher &lt;dominik@wombacher.cc&gt; --&gt;
&lt;!--  --&gt;
&lt;!-- SPDX-License-Identifier: CC-BY-SA-4.0 --&gt;
&lt;p&gt;I wrote about my first attempt
&lt;a class="reference external" href="https://dominik.wombacher.cc/posts/how-i-prepared-and-failed-the-1z0-819-java-se-11-developer-exam.html"&gt;last Year&lt;/a&gt;
and gave it a another try today, after preparing a lot throughout the last weeks,
but not as much as I actually planned to. I made the decision in February and wanted
to prepare 4 till 6 months on a daily basis.&lt;/p&gt;
&lt;p&gt;That sounded comfortable to work through the whole Study Guide and get enough practice.
But then life happened, things didn't worked out as planned and got delayed, so my
training schedule for the OCP 11 went down to just a few weeks with ~2 till 3 hours a day.&lt;/p&gt;
&lt;p&gt;My Score was 63%, which means 5% below the passing Score of 68%, so unfortunately
the second attempt failed as well, but I scored 8% higher as last time.&lt;/p&gt;
&lt;p&gt;I have to admit, first I was a little disappointed but then I realized how much
I learned and improved my Java Skills since last year in areas like:&lt;/p&gt;
&lt;blockquote&gt;
&lt;ul class="simple"&gt;
&lt;li&gt;JDBC API, Interfaces, Functional Interfaces, Sub- and Super-Classes, Abstract Classes,
NIO2 File API, Streams, Collections, Comparator and Comparable Interfaces, Variable Scopes, Encapsulation&lt;/li&gt;
&lt;/ul&gt;
&lt;/blockquote&gt;
&lt;p&gt;So my main goal, to getting better in Java, was actually achieved,
even though without some icing on the cake by passing the Exam ;)&lt;/p&gt;
&lt;p&gt;Based on the pure numbers, it doesn't seem like a huge step, but taking into
account the massive amount of Exam Objectives and the mostly very complex Questions,
I count it as huge step forward, especially under the circumstances that I'm not a
full time Developer, it's one of my passions but just a small portion of my day-to-day job.&lt;/p&gt;
&lt;p&gt;I started programming more than 20 years ago, classic with HTML, CSS and PHP4.
Throughout the years I also got experience in Java and Python, I also played around
with JavaScript and Golang, learned much about tools around development in general
and the ecosystem of those languages. I'm able to understand Code and troubleshoot
issues independent of the language, also implement fixes and modifications.
I just get things done.&lt;/p&gt;
&lt;p&gt;But I have the feeling that I never made it beyond mid-level Skills when it comes to pure
Software Development. Also I never learned a programming language A to Z, always just
what I needed, when I needed it. That's probably also one of the reasons why I jumped
so deep into Java now, I wanted to learn some fundamental concepts in detail instead
just scratching the surface.&lt;/p&gt;
&lt;p&gt;In my opinion the best way to prepare for the Exam are the Mock Tests from
&lt;a class="reference external" href="https://enthuware.com/java-certification-mock-exams/oracle-certified-professional/ocp-java-11-exam-1z0-819"&gt;enthuWare&lt;/a&gt;
and the &lt;a class="reference external" href="https://www.selikoff.net/ocp11-complete/"&gt;Java OCP 11 Developer Complete Study Guide&lt;/a&gt;,
which I mentioned already last year but actually used myself this time. It's a massive
Guide and at the beginning it feels overwhelming, but it's worth it to work through it.&lt;/p&gt;
&lt;p&gt;Besides that I started using &lt;a class="reference external" href="https://hyperskill.org/join/dae3a0276"&gt;Hyperskill (Referral Link)&lt;/a&gt;
a few months ago. If you already completed &lt;a class="reference external" href="https://java-programming.mooc.fi"&gt;Java Programming - Mooc.fi&lt;/a&gt;,
that could be a good next step to learn more but also stay motivated by working regularly
at some of the projects. For sure you can do the same on your own, but I found it useful
that I can just pick a Project and work on it instead making something up on my own.
Hyperskill also provides guidance and hints, but leaves the actual implementation fully
up to you, so it's about real programming and not blindely following a guide or ending
up in the tutorial hell.&lt;/p&gt;
&lt;p&gt;Most likely I will not try again to become a Oracle Certified Professional Java Developer
very soon, getting certified would've been nice, but I have other things to focus on
within the next months and even without passing the Exam, it was a valuable experience
and I can definitely use knowledge I gained during the Preparation.&lt;/p&gt;
</content><category term="Code"/><category term="Java"/><category term="Exam"/><category term="Certification"/></entry><entry><title>jDeepL - Unofficial DeepL App for Linux based on JavaFX</title><link href="https://dominik.wombacher.cc/posts/jdeepl_unofficial_deepl_app_for_linux_based_on_javafx.html" rel="alternate"/><published>2022-05-30T00:00:00+02:00</published><updated>2022-05-30T00:00:00+02:00</updated><author><name>Dominik Wombacher</name></author><id>tag:dominik.wombacher.cc,2022-05-30:/posts/jdeepl_unofficial_deepl_app_for_linux_based_on_javafx.html</id><summary type="html">&lt;!-- SPDX-FileCopyrightText: 2023 Dominik Wombacher &lt;dominik@wombacher.cc&gt; --&gt;
&lt;!--  --&gt;
&lt;!-- SPDX-License-Identifier: CC-BY-SA-4.0 --&gt;
&lt;p&gt;I'm a daily DeepL User, the Windows App is convenient but nothing comparable was available for Linux, so I build my own.&lt;/p&gt;
&lt;p&gt;jDeepL is a very simple GUI Application based  ... &lt;a class="read-more" href="/posts/jdeepl_unofficial_deepl_app_for_linux_based_on_javafx.html"&gt; [read more]&lt;/a&gt;&lt;/p&gt;</summary><content type="html">&lt;!-- SPDX-FileCopyrightText: 2023 Dominik Wombacher &lt;dominik@wombacher.cc&gt; --&gt;
&lt;!--  --&gt;
&lt;!-- SPDX-License-Identifier: CC-BY-SA-4.0 --&gt;
&lt;p&gt;I'm a daily DeepL User, the Windows App is convenient but nothing comparable was available for Linux, so I build my own.&lt;/p&gt;
&lt;p&gt;jDeepL is a very simple GUI Application based on JavaFX, developed and tested on openSUSE Tumbleweed with KDE Plasma.&lt;/p&gt;
&lt;p&gt;You can find the GPL v3 licensed Source Code here: &lt;a class="reference external" href="https://dominik.wombacher.cc/~git/jDeepL/"&gt;https://dominik.wombacher.cc/~git/jDeepL/&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;It's in an early stage but covers the most important functionality: Translating the marked text by pressing &lt;code&gt;CTRL + C + C&lt;/code&gt;.&lt;/p&gt;
&lt;p&gt;At least that's for me the most important one from the official Windows App ;)&lt;/p&gt;
&lt;p&gt;I will probably improve it further within the next time, feel free to Contribute.&lt;/p&gt;
&lt;p&gt;Further details can be found in the README: &lt;a class="reference external" href="https://dominik.wombacher.cc/~git/jDeepL/"&gt;https://dominik.wombacher.cc/~git/jDeepL/&lt;/a&gt;&lt;/p&gt;
</content><category term="Code"/><category term="DeepL"/><category term="Java"/><category term="JavaFX"/><category term="Linux"/></entry><entry><title>Setup Uyuni Development Environment with focus on Java and IntelliJ</title><link href="https://dominik.wombacher.cc/posts/setup_uyuni_development_environment_with_focus_on_java_and_intellij.html" rel="alternate"/><published>2022-03-09T00:00:00+01:00</published><updated>2022-05-18T00:00:00+02:00</updated><author><name>Dominik Wombacher</name></author><id>tag:dominik.wombacher.cc,2022-03-09:/posts/setup_uyuni_development_environment_with_focus_on_java_and_intellij.html</id><summary type="html">&lt;!-- SPDX-FileCopyrightText: 2023 Dominik Wombacher &lt;dominik@wombacher.cc&gt; --&gt;
&lt;!--  --&gt;
&lt;!-- SPDX-License-Identifier: CC-BY-SA-4.0 --&gt;
&lt;p&gt;Hacking Uyuni, either to troubleshoot and fix bugs or to contribute new features / improvements
is something I do since quite a while already, at least  whenever I find some time  ... &lt;a class="read-more" href="/posts/setup_uyuni_development_environment_with_focus_on_java_and_intellij.html"&gt; [read more]&lt;/a&gt;&lt;/p&gt;</summary><content type="html">&lt;!-- SPDX-FileCopyrightText: 2023 Dominik Wombacher &lt;dominik@wombacher.cc&gt; --&gt;
&lt;!--  --&gt;
&lt;!-- SPDX-License-Identifier: CC-BY-SA-4.0 --&gt;
&lt;p&gt;Hacking Uyuni, either to troubleshoot and fix bugs or to contribute new features / improvements
is something I do since quite a while already, at least  whenever I find some time.
Getting started wasn't that easy, there are a lot of resources available but sometimes there are outdated,
too focused on SUSE employees instead community contributors or just didn't fully answered my questions.&lt;/p&gt;
&lt;p&gt;So I want to share my experiences to Setup a Development Environment for Uyuni,
with focus on the Java Codebase, on a openSUSE Tumbleweed System by using sumaform and IntelliJ IDEA.&lt;/p&gt;
&lt;div class="contents local topic" id="contents"&gt;
&lt;ul class="simple"&gt;
&lt;li&gt;&lt;a class="reference internal" href="#resources" id="toc-entry-1"&gt;Resources&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a class="reference internal" href="#sumaform" id="toc-entry-2"&gt;sumaform&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a class="reference internal" href="#install-packages" id="toc-entry-3"&gt;Install Packages&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a class="reference internal" href="#clone-git-repo-and-prepare-files-folders" id="toc-entry-4"&gt;Clone git repo and prepare files / folders&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a class="reference internal" href="#configure-intellij-idea" id="toc-entry-5"&gt;Configure IntelliJ IDEA&lt;/a&gt;&lt;ul&gt;
&lt;li&gt;&lt;a class="reference internal" href="#enable-automatic-building" id="toc-entry-6"&gt;Enable automatic building&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a class="reference internal" href="#configure-code-style" id="toc-entry-7"&gt;Configure Code Style&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a class="reference internal" href="#remote-debugging" id="toc-entry-8"&gt;Remote Debugging&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a class="reference internal" href="#ivy-integration" id="toc-entry-9"&gt;Ivy integration&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a class="reference internal" href="#checkstyle-integration" id="toc-entry-10"&gt;CheckStyle integration&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a class="reference internal" href="#avoid-checkstyle-violations" id="toc-entry-11"&gt;Avoid CheckStyle violations&lt;/a&gt;&lt;ul&gt;
&lt;li&gt;&lt;a class="reference internal" href="#enabling-automatic-import-completion" id="toc-entry-12"&gt;enabling automatic import completion&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a class="reference internal" href="#disabling-star-imports" id="toc-entry-13"&gt;disabling &amp;quot;star imports&amp;quot;&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a class="reference internal" href="#wrapping-and-braces" id="toc-entry-14"&gt;wrapping and braces&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;&lt;a class="reference internal" href="#faster-deployments-via-manager-build-xml" id="toc-entry-15"&gt;Faster deployments via manager-build.xml&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a class="reference internal" href="#configure-junit-tests" id="toc-entry-16"&gt;Configure JUnit tests&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;&lt;a class="reference internal" href="#deploying-java-code-or-css" id="toc-entry-17"&gt;Deploying Java code or CSS&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a class="reference internal" href="#contribute" id="toc-entry-18"&gt;Contribute&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/div&gt;
&lt;hr class="docutils" /&gt;
&lt;div class="section" id="resources"&gt;
&lt;h2&gt;&lt;a class="toc-backref" href="#toc-entry-1"&gt;Resources&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;You can find a lot of information in the &lt;a class="reference external" href="https://github.com/uyuni-project/uyuni/wiki/"&gt;Uyuni Wiki&lt;/a&gt; and a
great &lt;a class="reference external" href="http://bosdonnat.fr/slides/openSUSEAsiaSummit19/"&gt;Presentation&lt;/a&gt;
(&lt;a class="reference external" href="https://web.archive.org/web/20211001151412/http://bosdonnat.fr/slides/openSUSEAsiaSummit19/"&gt;Archive&lt;/a&gt;,
&lt;a class="reference external" href="https://github.com/cbosdo/openSUSEAsia19-uyuni-dev"&gt;Source&lt;/a&gt;) from &lt;a class="reference external" href="http://bosdonnat.fr"&gt;Cédric Bosdonnat&lt;/a&gt;.&lt;/p&gt;
&lt;/div&gt;
&lt;div class="section" id="sumaform"&gt;
&lt;h2&gt;&lt;a class="toc-backref" href="#toc-entry-2"&gt;sumaform&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;See my Post &lt;a class="reference external" href="https://dominik.wombacher.cc/posts/uyuni_test_environment_with_sumaform_on_local_libvirt_host_opensuse_tumbleweed.html"&gt;Uyuni Test Environment with sumaform on local libvirt host (openSUSE Tumbleweed)&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;There are &lt;a class="reference external" href="https://github.com/uyuni-project/uyuni/wiki/Development-Environment-Alternative-Instructions"&gt;Alternative Instructions&lt;/a&gt;
(Archive: &lt;a class="reference external" href="https://web.archive.org/web/20220309214954/https://github.com/uyuni-project/uyuni/wiki/Development-Environment-Alternative-Instructions"&gt;[1]&lt;/a&gt;,
&lt;a class="reference external" href="https://archive.today/2022.03.09-214849/https://github.com/uyuni-project/uyuni/wiki/Development-Environment-Alternative-Instructions"&gt;[2]&lt;/a&gt;)
available in case using sumaform isn't possible or not intended.&lt;/p&gt;
&lt;/div&gt;
&lt;div class="section" id="install-packages"&gt;
&lt;h2&gt;&lt;a class="toc-backref" href="#toc-entry-3"&gt;Install Packages&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;Add the &lt;em&gt;systemsmanagement:Uyuni:Utils&lt;/em&gt; repository, especially for &lt;em&gt;obs-to-maven&lt;/em&gt;, and install the necessary packages.&lt;/p&gt;
&lt;p&gt;Manually:&lt;/p&gt;
&lt;pre class="code text literal-block"&gt;
sudo zypper addrepo obs://systemsmanagement:Uyuni:Utils systemsmanagement:uyuni:utils
sudo zypper in java-11-openjdk-devel openssh rsync apache-ivy ant ant-junit servletapi5 cpio obs-to-maven tito yarn

&lt;/pre&gt;
&lt;p&gt;Ansible snippet:&lt;/p&gt;
&lt;pre class="code yaml literal-block"&gt;
&lt;span class="pygments-p-Indicator"&gt;-&lt;/span&gt;&lt;span class="pygments-w"&gt; &lt;/span&gt;&lt;span class="pygments-nt"&gt;name&lt;/span&gt;&lt;span class="pygments-p"&gt;:&lt;/span&gt;&lt;span class="pygments-w"&gt; &lt;/span&gt;&lt;span class="pygments-l-Scalar-Plain"&gt;Import systemsmanagement:/Uyuni:/Utils RPM Key&lt;/span&gt;&lt;span class="pygments-w"&gt;
  &lt;/span&gt;&lt;span class="pygments-nt"&gt;rpm_key&lt;/span&gt;&lt;span class="pygments-p"&gt;:&lt;/span&gt;&lt;span class="pygments-w"&gt;
    &lt;/span&gt;&lt;span class="pygments-nt"&gt;key&lt;/span&gt;&lt;span class="pygments-p"&gt;:&lt;/span&gt;&lt;span class="pygments-w"&gt; &lt;/span&gt;&lt;span class="pygments-l-Scalar-Plain"&gt;https://download.opensuse.org/repositories/systemsmanagement:/Uyuni:/Utils/openSUSE_Tumbleweed/repodata/repomd.xml.key&lt;/span&gt;&lt;span class="pygments-w"&gt;
    &lt;/span&gt;&lt;span class="pygments-nt"&gt;state&lt;/span&gt;&lt;span class="pygments-p"&gt;:&lt;/span&gt;&lt;span class="pygments-w"&gt; &lt;/span&gt;&lt;span class="pygments-l-Scalar-Plain"&gt;present&lt;/span&gt;&lt;span class="pygments-w"&gt;

&lt;/span&gt;&lt;span class="pygments-p-Indicator"&gt;-&lt;/span&gt;&lt;span class="pygments-w"&gt; &lt;/span&gt;&lt;span class="pygments-nt"&gt;name&lt;/span&gt;&lt;span class="pygments-p"&gt;:&lt;/span&gt;&lt;span class="pygments-w"&gt; &lt;/span&gt;&lt;span class="pygments-l-Scalar-Plain"&gt;Add systemsmanagement:/Uyuni:/Utils RPM Repository&lt;/span&gt;&lt;span class="pygments-w"&gt;
  &lt;/span&gt;&lt;span class="pygments-nt"&gt;community.general.zypper_repository&lt;/span&gt;&lt;span class="pygments-p"&gt;:&lt;/span&gt;&lt;span class="pygments-w"&gt;
    &lt;/span&gt;&lt;span class="pygments-nt"&gt;name&lt;/span&gt;&lt;span class="pygments-p"&gt;:&lt;/span&gt;&lt;span class="pygments-w"&gt; &lt;/span&gt;&lt;span class="pygments-l-Scalar-Plain"&gt;systemsmanagement_uyuni_utils&lt;/span&gt;&lt;span class="pygments-w"&gt;
    &lt;/span&gt;&lt;span class="pygments-nt"&gt;description&lt;/span&gt;&lt;span class="pygments-p"&gt;:&lt;/span&gt;&lt;span class="pygments-w"&gt; &lt;/span&gt;&lt;span class="pygments-l-Scalar-Plain"&gt;Several utilities to develop, build or release Uyuni (openSUSE_Tumbleweed)&lt;/span&gt;&lt;span class="pygments-w"&gt;
    &lt;/span&gt;&lt;span class="pygments-nt"&gt;repo&lt;/span&gt;&lt;span class="pygments-p"&gt;:&lt;/span&gt;&lt;span class="pygments-w"&gt; &lt;/span&gt;&lt;span class="pygments-l-Scalar-Plain"&gt;https://download.opensuse.org/repositories/systemsmanagement:/Uyuni:/Utils/openSUSE_Tumbleweed/&lt;/span&gt;&lt;span class="pygments-w"&gt;
    &lt;/span&gt;&lt;span class="pygments-nt"&gt;priority&lt;/span&gt;&lt;span class="pygments-p"&gt;:&lt;/span&gt;&lt;span class="pygments-w"&gt; &lt;/span&gt;&lt;span class="pygments-l-Scalar-Plain"&gt;95&lt;/span&gt;&lt;span class="pygments-w"&gt;
    &lt;/span&gt;&lt;span class="pygments-nt"&gt;state&lt;/span&gt;&lt;span class="pygments-p"&gt;:&lt;/span&gt;&lt;span class="pygments-w"&gt; &lt;/span&gt;&lt;span class="pygments-l-Scalar-Plain"&gt;present&lt;/span&gt;&lt;span class="pygments-w"&gt;
  &lt;/span&gt;&lt;span class="pygments-nt"&gt;ignore_errors&lt;/span&gt;&lt;span class="pygments-p"&gt;:&lt;/span&gt;&lt;span class="pygments-w"&gt; &lt;/span&gt;&lt;span class="pygments-l-Scalar-Plain"&gt;true&lt;/span&gt;&lt;span class="pygments-w"&gt;

&lt;/span&gt;&lt;span class="pygments-p-Indicator"&gt;-&lt;/span&gt;&lt;span class="pygments-w"&gt; &lt;/span&gt;&lt;span class="pygments-nt"&gt;name&lt;/span&gt;&lt;span class="pygments-p"&gt;:&lt;/span&gt;&lt;span class="pygments-w"&gt; &lt;/span&gt;&lt;span class="pygments-l-Scalar-Plain"&gt;Package Installation (Uyuni Development)&lt;/span&gt;&lt;span class="pygments-w"&gt;
  &lt;/span&gt;&lt;span class="pygments-nt"&gt;community.general.zypper&lt;/span&gt;&lt;span class="pygments-p"&gt;:&lt;/span&gt;&lt;span class="pygments-w"&gt;
    &lt;/span&gt;&lt;span class="pygments-nt"&gt;name&lt;/span&gt;&lt;span class="pygments-p"&gt;:&lt;/span&gt;&lt;span class="pygments-w"&gt;
      &lt;/span&gt;&lt;span class="pygments-p-Indicator"&gt;-&lt;/span&gt;&lt;span class="pygments-w"&gt; &lt;/span&gt;&lt;span class="pygments-l-Scalar-Plain"&gt;java-11-openjdk-devel&lt;/span&gt;&lt;span class="pygments-w"&gt;
      &lt;/span&gt;&lt;span class="pygments-p-Indicator"&gt;-&lt;/span&gt;&lt;span class="pygments-w"&gt; &lt;/span&gt;&lt;span class="pygments-l-Scalar-Plain"&gt;openssh&lt;/span&gt;&lt;span class="pygments-w"&gt;
      &lt;/span&gt;&lt;span class="pygments-p-Indicator"&gt;-&lt;/span&gt;&lt;span class="pygments-w"&gt; &lt;/span&gt;&lt;span class="pygments-l-Scalar-Plain"&gt;rsync&lt;/span&gt;&lt;span class="pygments-w"&gt;
      &lt;/span&gt;&lt;span class="pygments-p-Indicator"&gt;-&lt;/span&gt;&lt;span class="pygments-w"&gt; &lt;/span&gt;&lt;span class="pygments-l-Scalar-Plain"&gt;apache-ivy&lt;/span&gt;&lt;span class="pygments-w"&gt;
      &lt;/span&gt;&lt;span class="pygments-p-Indicator"&gt;-&lt;/span&gt;&lt;span class="pygments-w"&gt; &lt;/span&gt;&lt;span class="pygments-l-Scalar-Plain"&gt;ant&lt;/span&gt;&lt;span class="pygments-w"&gt;
      &lt;/span&gt;&lt;span class="pygments-p-Indicator"&gt;-&lt;/span&gt;&lt;span class="pygments-w"&gt; &lt;/span&gt;&lt;span class="pygments-l-Scalar-Plain"&gt;ant-junit&lt;/span&gt;&lt;span class="pygments-w"&gt;
      &lt;/span&gt;&lt;span class="pygments-p-Indicator"&gt;-&lt;/span&gt;&lt;span class="pygments-w"&gt; &lt;/span&gt;&lt;span class="pygments-l-Scalar-Plain"&gt;servletapi5&lt;/span&gt;&lt;span class="pygments-w"&gt;
      &lt;/span&gt;&lt;span class="pygments-p-Indicator"&gt;-&lt;/span&gt;&lt;span class="pygments-w"&gt; &lt;/span&gt;&lt;span class="pygments-l-Scalar-Plain"&gt;obs-to-maven&lt;/span&gt;&lt;span class="pygments-w"&gt;
      &lt;/span&gt;&lt;span class="pygments-p-Indicator"&gt;-&lt;/span&gt;&lt;span class="pygments-w"&gt; &lt;/span&gt;&lt;span class="pygments-l-Scalar-Plain"&gt;tito&lt;/span&gt;&lt;span class="pygments-w"&gt;
      &lt;/span&gt;&lt;span class="pygments-p-Indicator"&gt;-&lt;/span&gt;&lt;span class="pygments-w"&gt; &lt;/span&gt;&lt;span class="pygments-l-Scalar-Plain"&gt;yarn&lt;/span&gt;&lt;span class="pygments-w"&gt;
    &lt;/span&gt;&lt;span class="pygments-nt"&gt;allow_vendor_change&lt;/span&gt;&lt;span class="pygments-p"&gt;:&lt;/span&gt;&lt;span class="pygments-w"&gt; &lt;/span&gt;&lt;span class="pygments-l-Scalar-Plain"&gt;true&lt;/span&gt;&lt;span class="pygments-w"&gt;
    &lt;/span&gt;&lt;span class="pygments-nt"&gt;force_resolution&lt;/span&gt;&lt;span class="pygments-p"&gt;:&lt;/span&gt;&lt;span class="pygments-w"&gt; &lt;/span&gt;&lt;span class="pygments-l-Scalar-Plain"&gt;true&lt;/span&gt;&lt;span class="pygments-w"&gt;
    &lt;/span&gt;&lt;span class="pygments-nt"&gt;force&lt;/span&gt;&lt;span class="pygments-p"&gt;:&lt;/span&gt;&lt;span class="pygments-w"&gt; &lt;/span&gt;&lt;span class="pygments-l-Scalar-Plain"&gt;true&lt;/span&gt;&lt;span class="pygments-w"&gt;
    &lt;/span&gt;&lt;span class="pygments-nt"&gt;state&lt;/span&gt;&lt;span class="pygments-p"&gt;:&lt;/span&gt;&lt;span class="pygments-w"&gt; &lt;/span&gt;&lt;span class="pygments-l-Scalar-Plain"&gt;latest&lt;/span&gt;&lt;span class="pygments-w"&gt;
&lt;/span&gt;
&lt;/pre&gt;
&lt;/div&gt;
&lt;div class="section" id="clone-git-repo-and-prepare-files-folders"&gt;
&lt;h2&gt;&lt;a class="toc-backref" href="#toc-entry-4"&gt;Clone git repo and prepare files / folders&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;Fork the &lt;a class="reference external" href="https://github.com/uyuni-project/uyuni"&gt;Uyuni Repository&lt;/a&gt; and clone it.
I will use the placeholder &lt;code&gt;&amp;lt;path_to_uyuni&amp;gt;&lt;/code&gt; a lot, which refers to the local path of your cloned uyuni fork.&lt;/p&gt;
&lt;p&gt;Let's start with some files and folders which are required at a later point for unittest and deployment.&lt;/p&gt;
&lt;p&gt;Create the folders &lt;em&gt;/usr/share/rhn/config-defaults&lt;/em&gt;, &lt;em&gt;/var/log/rhn&lt;/em&gt; and &lt;em&gt;/srv/susemanager&lt;/em&gt;, owner and group should match with your user account.&lt;/p&gt;
&lt;p&gt;Ansible snippet:&lt;/p&gt;
&lt;pre class="code yaml literal-block"&gt;
&lt;span class="pygments-p-Indicator"&gt;-&lt;/span&gt;&lt;span class="pygments-w"&gt; &lt;/span&gt;&lt;span class="pygments-nt"&gt;name&lt;/span&gt;&lt;span class="pygments-p"&gt;:&lt;/span&gt;&lt;span class="pygments-w"&gt; &lt;/span&gt;&lt;span class="pygments-l-Scalar-Plain"&gt;Create Folders for Uyuni Development Unittests and Build&lt;/span&gt;&lt;span class="pygments-w"&gt;
  &lt;/span&gt;&lt;span class="pygments-nt"&gt;file&lt;/span&gt;&lt;span class="pygments-p"&gt;:&lt;/span&gt;&lt;span class="pygments-w"&gt;
    &lt;/span&gt;&lt;span class="pygments-nt"&gt;path&lt;/span&gt;&lt;span class="pygments-p"&gt;:&lt;/span&gt;&lt;span class="pygments-w"&gt; &lt;/span&gt;&lt;span class="pygments-s"&gt;&amp;quot;{{&lt;/span&gt;&lt;span class="pygments-nv"&gt; &lt;/span&gt;&lt;span class="pygments-s"&gt;item&lt;/span&gt;&lt;span class="pygments-nv"&gt; &lt;/span&gt;&lt;span class="pygments-s"&gt;}}&amp;quot;&lt;/span&gt;&lt;span class="pygments-w"&gt;
    &lt;/span&gt;&lt;span class="pygments-nt"&gt;state&lt;/span&gt;&lt;span class="pygments-p"&gt;:&lt;/span&gt;&lt;span class="pygments-w"&gt; &lt;/span&gt;&lt;span class="pygments-l-Scalar-Plain"&gt;directory&lt;/span&gt;&lt;span class="pygments-w"&gt;
    &lt;/span&gt;&lt;span class="pygments-nt"&gt;owner&lt;/span&gt;&lt;span class="pygments-p"&gt;:&lt;/span&gt;&lt;span class="pygments-w"&gt; &lt;/span&gt;&lt;span class="pygments-l-Scalar-Plain"&gt;wombelix&lt;/span&gt;&lt;span class="pygments-w"&gt;
    &lt;/span&gt;&lt;span class="pygments-nt"&gt;group&lt;/span&gt;&lt;span class="pygments-p"&gt;:&lt;/span&gt;&lt;span class="pygments-w"&gt; &lt;/span&gt;&lt;span class="pygments-l-Scalar-Plain"&gt;users&lt;/span&gt;&lt;span class="pygments-w"&gt;
  &lt;/span&gt;&lt;span class="pygments-nt"&gt;loop&lt;/span&gt;&lt;span class="pygments-p"&gt;:&lt;/span&gt;&lt;span class="pygments-w"&gt;
    &lt;/span&gt;&lt;span class="pygments-p-Indicator"&gt;-&lt;/span&gt;&lt;span class="pygments-w"&gt; &lt;/span&gt;&lt;span class="pygments-l-Scalar-Plain"&gt;/usr/share/rhn/config-defaults&lt;/span&gt;&lt;span class="pygments-w"&gt;
    &lt;/span&gt;&lt;span class="pygments-p-Indicator"&gt;-&lt;/span&gt;&lt;span class="pygments-w"&gt; &lt;/span&gt;&lt;span class="pygments-l-Scalar-Plain"&gt;/var/log/rhn&lt;/span&gt;&lt;span class="pygments-w"&gt;
    &lt;/span&gt;&lt;span class="pygments-p-Indicator"&gt;-&lt;/span&gt;&lt;span class="pygments-w"&gt; &lt;/span&gt;&lt;span class="pygments-l-Scalar-Plain"&gt;/srv/susemanager&lt;/span&gt;&lt;span class="pygments-w"&gt;
&lt;/span&gt;
&lt;/pre&gt;
&lt;p&gt;Create a &lt;em&gt;rhn.conf&lt;/em&gt; used by JUnit:&lt;/p&gt;
&lt;pre class="code text literal-block"&gt;
cp &amp;lt;path_to_uyuni_root&amp;gt;/java/buildconf/test/rhn.conf.postgresql-example &amp;lt;path_to_uyuni_root&amp;gt;/java/buildconf/test/rhn.conf

&lt;/pre&gt;
&lt;p&gt;Get / update java libraries and dependencies:&lt;/p&gt;
&lt;pre class="code text literal-block"&gt;
cd &amp;lt;path_to_uyuni_root&amp;gt;/java
ant -f manager-build.xml ivy

&lt;/pre&gt;
&lt;p&gt;Compile branding jar for the first time:&lt;/p&gt;
&lt;pre class="code text literal-block"&gt;
cd &amp;lt;path_to_uyuni_root&amp;gt;/java
ant -f manager-build.xml refresh-branding-jar

&lt;/pre&gt;
&lt;/div&gt;
&lt;div class="section" id="configure-intellij-idea"&gt;
&lt;h2&gt;&lt;a class="toc-backref" href="#toc-entry-5"&gt;Configure IntelliJ IDEA&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;I will focus on IntelliJ IDEA but can also use
&lt;a class="reference external" href="https://github.com/uyuni-project/uyuni/wiki/Eclipse-specific-development-instructions"&gt;Eclipse&lt;/a&gt;
(Archive: &lt;a class="reference external" href="https://web.archive.org/web/20220309215457/https://github.com/uyuni-project/uyuni/wiki/Eclipse-specific-development-instructions"&gt;[1]&lt;/a&gt;,
&lt;a class="reference external" href="https://archive.today/2022.03.09-215319/https://github.com/uyuni-project/uyuni/wiki/Eclipse-specific-development-instructions"&gt;[2]&lt;/a&gt;)
or &lt;a class="reference external" href="https://github.com/uyuni-project/uyuni/wiki/VS-Code-specific-development-instructions"&gt;VSCode&lt;/a&gt;
(Archive: &lt;a class="reference external" href="https://web.archive.org/web/20220309215449/https://github.com/uyuni-project/uyuni/wiki/VS-Code-specific-development-instructions"&gt;[1]&lt;/a&gt;,
&lt;a class="reference external" href="https://archive.today/2022.03.09-215515/https://github.com/uyuni-project/uyuni/wiki/VS-Code-specific-development-instructions"&gt;[2]&lt;/a&gt;), if you want.&lt;/p&gt;
&lt;p&gt;The following Steps are heavily based on
&lt;a class="reference external" href="https://github.com/uyuni-project/uyuni/wiki/IntelliJ-IDEA-specific-development-instructions"&gt;IntelliJ IDEA specific development instructions&lt;/a&gt;
(Archive: &lt;a class="reference external" href="https://web.archive.org/web/20220309215526/https://github.com/uyuni-project/uyuni/wiki/IntelliJ-IDEA-specific-development-instructions"&gt;[1]&lt;/a&gt;,
&lt;a class="reference external" href="https://archive.today/2022.03.09-215715/https://github.com/uyuni-project/uyuni/wiki/IntelliJ-IDEA-specific-development-instructions"&gt;[2]&lt;/a&gt;)
and &lt;a class="reference external" href="https://github.com/uyuni-project/uyuni/wiki/Java-Development-Environment"&gt;Java Development Environment&lt;/a&gt;
(Archive: &lt;a class="reference external" href="https://web.archive.org/web/20220309215601/https://github.com/uyuni-project/uyuni/wiki/Java-Development-Environment"&gt;[1]&lt;/a&gt;,
&lt;a class="reference external" href="https://archive.today/2022.03.09-215915/https://github.com/uyuni-project/uyuni/wiki/Java-Development-Environment"&gt;[2]&lt;/a&gt;)
with some adjustments, additional information and tested on IntelliJ IDEA Ultimate 2022.1 EAP.&lt;/p&gt;
&lt;p&gt;The JetBrain Toolbox is in my opinion the easiest way to install and update IntelliJ.
If you installed it manually, please check the documentation where / how you can configure the &lt;em&gt;vmoptions&lt;/em&gt;.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Toolbox App &amp;gt; three dots next to &amp;quot;IntelliJ IDEA&amp;quot; &amp;gt; Settings &amp;gt; Configuration &amp;gt; Java Virtual Machine options &amp;quot;Edit...&amp;quot;&lt;/strong&gt;&lt;/p&gt;
&lt;blockquote&gt;
Replace &lt;code&gt;-Xmx2048m&lt;/code&gt; with &lt;code&gt;-Xmx4G&lt;/code&gt;&lt;/blockquote&gt;
&lt;p&gt;Source:
&lt;a class="reference external" href="https://intellij-support.jetbrains.com/hc/en-us/articles/206544869-Configuring-JVM-options-and-platform-properties"&gt;https://intellij-support.jetbrains.com&lt;/a&gt;
(Archive: &lt;a class="reference external" href="https://web.archive.org/web/20211213213449/https://intellij-support.jetbrains.com/hc/en-us/articles/206544869-Configuring-JVM-options-and-platform-properties"&gt;[1]&lt;/a&gt;,
&lt;a class="reference external" href="https://archive.today/2022.03.09-220705/https://intellij-support.jetbrains.com/hc/en-us/articles/206544869-Configuring-JVM-options-and-platform-properties"&gt;[2]&lt;/a&gt;)&lt;/p&gt;
&lt;p&gt;Afterwards start IntelliJ IDEA to proceed with the actual configuration.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;File &amp;gt; New &amp;gt; Project from existing Source&lt;/strong&gt;&lt;/p&gt;
&lt;blockquote&gt;
&lt;div class="line-block"&gt;
&lt;div class="line"&gt;Select &amp;lt;path_to_uyuni_root&amp;gt;&lt;/div&gt;
&lt;div class="line"&gt;Create Project from existing Source&lt;/div&gt;
&lt;div class="line"&gt;Accept the project format defaults&lt;/div&gt;
&lt;div class="line"&gt;Also accept auto discovered source directories&lt;/div&gt;
&lt;div class="line"&gt;From the Libraries list, uncheck all items&lt;/div&gt;
&lt;div class="line"&gt;From the Modules list, only check the items corresponding to the following directories:&lt;/div&gt;
&lt;/div&gt;
&lt;blockquote&gt;
&lt;div class="line-block"&gt;
&lt;div class="line"&gt;&lt;code&gt;uyuni/java/code&lt;/code&gt; (change the name to code)&lt;/div&gt;
&lt;div class="line"&gt;&lt;code&gt;uyuni/branding/java/code&lt;/code&gt; (change the name to branding)&lt;/div&gt;
&lt;/div&gt;
&lt;/blockquote&gt;
&lt;div class="line-block"&gt;
&lt;div class="line"&gt;Select a Java 11 runtime e.g. the previously installed openJDK&lt;/div&gt;
&lt;div class="line"&gt;Ultimate Edition: Unselect eventually found frameworks&lt;/div&gt;
&lt;/div&gt;
&lt;/blockquote&gt;
&lt;div class="section" id="enable-automatic-building"&gt;
&lt;h3&gt;&lt;a class="toc-backref" href="#toc-entry-6"&gt;Enable automatic building&lt;/a&gt;&lt;/h3&gt;
&lt;p&gt;&lt;strong&gt;File &amp;gt; Settings... &amp;gt; Build, Execution, Deployment &amp;gt; Compiler and select &amp;quot;Build project automatically&amp;quot;&lt;/strong&gt;&lt;/p&gt;
&lt;/div&gt;
&lt;div class="section" id="configure-code-style"&gt;
&lt;h3&gt;&lt;a class="toc-backref" href="#toc-entry-7"&gt;Configure Code Style&lt;/a&gt;&lt;/h3&gt;
&lt;p&gt;&lt;strong&gt;File &amp;gt; Settings... &amp;gt; Editor &amp;gt; Code Style &amp;gt; Java &amp;gt; Imports&lt;/strong&gt;&lt;/p&gt;
&lt;blockquote&gt;
Click on the cog / settings icon next to the &amp;quot;Scheme: Default&amp;quot; field at the top, then &amp;quot;Import Scheme&amp;quot;, &amp;quot;IntelliJ IDEA code style XML&amp;quot; and select the &lt;code&gt;&amp;lt;path_to_uyuni_root&amp;gt;/java/conf/intellij-codestyle.xml&lt;/code&gt; file.&lt;/blockquote&gt;
&lt;/div&gt;
&lt;div class="section" id="remote-debugging"&gt;
&lt;h3&gt;&lt;a class="toc-backref" href="#toc-entry-8"&gt;Remote Debugging&lt;/a&gt;&lt;/h3&gt;
&lt;p&gt;&lt;strong&gt;Run &amp;gt; Edit Configurations... &amp;gt; + sign&lt;/strong&gt;&lt;/p&gt;
&lt;blockquote&gt;
&lt;div class="line-block"&gt;
&lt;div class="line"&gt;Accept all defaults, except from Host and Port, configure them based on the service you want to debug.&lt;/div&gt;
&lt;div class="line"&gt;8000 for Tomcat, 8001 for Taskomatic, 8002 for Search (defaults if deployed with sumaform)&lt;/div&gt;
&lt;/div&gt;
&lt;/blockquote&gt;
&lt;p&gt;Further reading: &lt;a class="reference external" href="https://www.jetbrains.com/help/idea/debugging-code.html#general-procedure"&gt;IntelliJ IDEA Debugging Guide&lt;/a&gt;
(Archive: &lt;a class="reference external" href="https://web.archive.org/web/20220218091806/https://www.jetbrains.com/help/idea/debugging-code.html"&gt;[1]&lt;/a&gt;,
&lt;a class="reference external" href="https://archive.today/2022.03.09-220232/https://www.jetbrains.com/help/idea/debugging-code.html%23general-procedure"&gt;[2]&lt;/a&gt;)&lt;/p&gt;
&lt;/div&gt;
&lt;div class="section" id="ivy-integration"&gt;
&lt;h3&gt;&lt;a class="toc-backref" href="#toc-entry-9"&gt;Ivy integration&lt;/a&gt;&lt;/h3&gt;
&lt;p&gt;&lt;strong&gt;File &amp;gt; Settings... &amp;gt; Plugins &amp;gt; Browse repositories... &amp;gt; search for &amp;quot;IvyIDEA&amp;quot; &amp;gt; Install the Ivy plugin&lt;/strong&gt;&lt;/p&gt;
&lt;blockquote&gt;
Restart IntelliJ IDEA (if asked) to activate the plugin&lt;/blockquote&gt;
&lt;p&gt;&lt;strong&gt;File &amp;gt; Project Structure... &amp;gt; Modules -&amp;gt; right click on code &amp;gt; + sign &amp;gt; click on &amp;quot;ivyIDEA&amp;quot; to enable the plugin for the project&lt;/strong&gt;&lt;/p&gt;
&lt;blockquote&gt;
&lt;div class="line-block"&gt;
&lt;div class="line"&gt;Click on folder icon at the right side to select the Ivy configuration path: &lt;code&gt;&amp;lt;path_to_uyuni_root&amp;gt;/java/buildconf/ivy/ivy-suse.xml&lt;/code&gt;&lt;/div&gt;
&lt;div class="line"&gt;Check &amp;quot;Use module specific ivy settings&amp;quot;&lt;/div&gt;
&lt;div class="line"&gt;Click on folder icon at the right side to select the Ivy configuration path: &lt;code&gt;&amp;lt;path_to_uyuni_root&amp;gt;/java/buildconf/ivy/ivyconf.xml&lt;/code&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;/blockquote&gt;
&lt;p&gt;&lt;strong&gt;Tools &amp;gt; IvyIDEA &amp;gt; &amp;quot;Resolve for all modules&amp;quot; to get updated Ivy dependencies&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;&lt;em&gt;Note: When switching branches that have different dependencies (notably, major versions) you have to:&lt;/em&gt;&lt;/p&gt;
&lt;blockquote&gt;
&lt;div class="line-block"&gt;
&lt;div class="line"&gt;Tools &amp;gt; IvyIDEA &amp;gt; Remove all resolved libraries&lt;/div&gt;
&lt;div class="line"&gt;Tools &amp;gt; IvyIDEA &amp;gt; Resolve for all modules&lt;/div&gt;
&lt;div class="line"&gt;Build &amp;gt; Rebuild project&lt;/div&gt;
&lt;/div&gt;
&lt;/blockquote&gt;
&lt;/div&gt;
&lt;div class="section" id="checkstyle-integration"&gt;
&lt;h3&gt;&lt;a class="toc-backref" href="#toc-entry-10"&gt;CheckStyle integration&lt;/a&gt;&lt;/h3&gt;
&lt;p&gt;&lt;strong&gt;File &amp;gt; Settings... &amp;gt; Plugins &amp;gt; Browse repositories... &amp;gt; search for &amp;quot;CheckStyle&amp;quot; -&amp;gt; Install the CheckStyle IDEA plugin&lt;/strong&gt;&lt;/p&gt;
&lt;blockquote&gt;
Restart IntelliJ IDEA to activate the plugin&lt;/blockquote&gt;
&lt;p&gt;&lt;strong&gt;File &amp;gt; Settings... &amp;gt; Tools &amp;gt; Checkstyle&lt;/strong&gt;&lt;/p&gt;
&lt;blockquote&gt;
&lt;div class="line-block"&gt;
&lt;div class="line"&gt;Change the Checkstyle version to the one in &lt;code&gt;&amp;lt;path_to_uyuni_root&amp;gt;/java/buildconf/ivy/ivy-suse.xml&lt;/code&gt; (currently 8.30)&lt;/div&gt;
&lt;div class="line"&gt;Click on the + sign next to Configuration File&lt;/div&gt;
&lt;div class="line"&gt;&lt;br /&gt;&lt;/div&gt;
&lt;div class="line"&gt;Description: Uyuni&lt;/div&gt;
&lt;div class="line"&gt;Check &amp;quot;Use a local Checkstyle file&amp;quot;, select &lt;code&gt;&amp;lt;path_to_uyuni_root&amp;gt;/java/buildconf/checkstyle.xml&lt;/code&gt;&lt;/div&gt;
&lt;div class="line"&gt;Check &amp;quot;Store relative to project location&amp;quot;, click on Next&lt;/div&gt;
&lt;/div&gt;
&lt;p&gt;Set the following values for properties:&lt;/p&gt;
&lt;pre class="code text literal-block"&gt;
checkstyle.cache.file: &amp;lt;path_to_uyuni_root&amp;gt;/java/build/checkstyle.cache.src
checkstyle.header.file: &amp;lt;path_to_uyuni_root&amp;gt;/java/buildconf/LICENSE.txt
checkstyle.suppressions.file: &amp;lt;path_to_uyuni_root&amp;gt;/java/buildconf/checkstyle-suppressions.xml
javadoc.lazy: false
javadoc.method.scope: public
javadoc.type.scope: package
javadoc.var.scope: package

&lt;/pre&gt;
&lt;p&gt;Click on Finish, mark the file as Active, click on Apply and leave the Settings.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;Afterwards a new mini-tab will appear at the bottom named &amp;quot;CheckStyle&amp;quot;.&lt;/p&gt;
&lt;/div&gt;
&lt;div class="section" id="avoid-checkstyle-violations"&gt;
&lt;h3&gt;&lt;a class="toc-backref" href="#toc-entry-11"&gt;Avoid CheckStyle violations&lt;/a&gt;&lt;/h3&gt;
&lt;p&gt;These are recommended settings, which might already be set as default, that help respecting style guidelines independent of the CheckStyle plugin:&lt;/p&gt;
&lt;div class="section" id="enabling-automatic-import-completion"&gt;
&lt;h4&gt;&lt;a class="toc-backref" href="#toc-entry-12"&gt;enabling automatic import completion&lt;/a&gt;&lt;/h4&gt;
&lt;p&gt;&lt;strong&gt;File &amp;gt; Settings... &amp;gt; Editor &amp;gt; General &amp;gt; Auto Import&lt;/strong&gt;&lt;/p&gt;
&lt;blockquote&gt;
&lt;div class="line-block"&gt;
&lt;div class="line"&gt;Set &amp;quot;Insert imports on paste&amp;quot; to &amp;quot;Always&amp;quot;&lt;/div&gt;
&lt;div class="line"&gt;Select &amp;quot;Add unambiguous imports on the fly&amp;quot; and &amp;quot;Optimize imports on the fly&amp;quot; in the Java Section.&lt;/div&gt;
&lt;/div&gt;
&lt;/blockquote&gt;
&lt;/div&gt;
&lt;div class="section" id="disabling-star-imports"&gt;
&lt;h4&gt;&lt;a class="toc-backref" href="#toc-entry-13"&gt;disabling &amp;quot;star imports&amp;quot;&lt;/a&gt;&lt;/h4&gt;
&lt;p&gt;&lt;strong&gt;File &amp;gt; Settings... &amp;gt; Editor &amp;gt; Code Style &amp;gt; Java &amp;gt; Imports&lt;/strong&gt;&lt;/p&gt;
&lt;blockquote&gt;
&lt;div class="line-block"&gt;
&lt;div class="line"&gt;Class count to use import with '*' &amp;gt; 999&lt;/div&gt;
&lt;div class="line"&gt;Names count to use static import with '*' &amp;gt; 999&lt;/div&gt;
&lt;/div&gt;
&lt;/blockquote&gt;
&lt;/div&gt;
&lt;div class="section" id="wrapping-and-braces"&gt;
&lt;h4&gt;&lt;a class="toc-backref" href="#toc-entry-14"&gt;wrapping and braces&lt;/a&gt;&lt;/h4&gt;
&lt;p&gt;&lt;strong&gt;File &amp;gt; Settings... &amp;gt; Editor &amp;gt; Code Style &amp;gt; Java &amp;gt; Wrapping and Braces&lt;/strong&gt;&lt;/p&gt;
&lt;blockquote&gt;
&lt;div class="line-block"&gt;
&lt;div class="line"&gt;Under 'try' statement check 'catch' on new line and 'finally' on new line&lt;/div&gt;
&lt;div class="line"&gt;Under 'if' statement check 'else' on new line&lt;/div&gt;
&lt;/div&gt;
&lt;/blockquote&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class="section" id="faster-deployments-via-manager-build-xml"&gt;
&lt;h3&gt;&lt;a class="toc-backref" href="#toc-entry-15"&gt;Faster deployments via manager-build.xml&lt;/a&gt;&lt;/h3&gt;
&lt;p&gt;Change the output directory to enable quick &lt;em&gt;manager-build.xml&lt;/em&gt; deploys:&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;File -&amp;gt; Project Structure... -&amp;gt; Modules -&amp;gt; code -&amp;gt; Paths&lt;/strong&gt;&lt;/p&gt;
&lt;blockquote&gt;
&lt;div class="line-block"&gt;
&lt;div class="line-block"&gt;
&lt;div class="line"&gt;Click on &amp;quot;Use module compile output path&amp;quot; and set:&lt;/div&gt;
&lt;/div&gt;
&lt;div class="line"&gt;&amp;quot;Output path&amp;quot; to &lt;code&gt;&amp;lt;path_to_uyuni_root&amp;gt;/java/build/classes&lt;/code&gt;&lt;/div&gt;
&lt;div class="line"&gt;&amp;quot;Test output path&amp;quot; to &lt;code&gt;&amp;lt;path_to_uyuni_root&amp;gt;/java/build/tests&lt;/code&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;/blockquote&gt;
&lt;p&gt;Enable usage of precompiled files by adding &lt;code&gt;precompiled=true&lt;/code&gt; to &lt;code&gt;&amp;lt;path_to_uyuni_root&amp;gt;/java/buildconf/manager-developer-build.properties&lt;/code&gt;,
if the file not exist, copy &lt;code&gt;&amp;lt;path_to_uyuni_root&amp;gt;/java/buildconf/manager-developer-build.properties.example&lt;/code&gt;, rename and edit the new file.&lt;/p&gt;
&lt;/div&gt;
&lt;div class="section" id="configure-junit-tests"&gt;
&lt;h3&gt;&lt;a class="toc-backref" href="#toc-entry-16"&gt;Configure JUnit tests&lt;/a&gt;&lt;/h3&gt;
&lt;p&gt;&lt;strong&gt;File &amp;gt; Project Structure... &amp;gt; Modules &amp;gt; code &amp;gt; Dependencies&lt;/strong&gt;&lt;/p&gt;
&lt;blockquote&gt;
Click the + sign &amp;gt; Module dependency &amp;gt; branding &amp;gt; OK to include branding classes and files in the build&lt;/blockquote&gt;
&lt;p&gt;&lt;strong&gt;File &amp;gt; Project Structure... -&amp;gt; Modules -&amp;gt; code&lt;/strong&gt;&lt;/p&gt;
&lt;blockquote&gt;
Mark the directory webapp as Resources&lt;/blockquote&gt;
&lt;p&gt;&lt;strong&gt;Run &amp;gt; Edit Configurations... &amp;gt; + sign &amp;gt; JUnit&lt;/strong&gt;&lt;/p&gt;
&lt;blockquote&gt;
&lt;div class="line-block"&gt;
&lt;div class="line"&gt;Name: JUnit&lt;/div&gt;
&lt;div class="line"&gt;Run on: Local machine&lt;/div&gt;
&lt;div class="line"&gt;Build and run:&lt;/div&gt;
&lt;/div&gt;
&lt;pre class="code text literal-block"&gt;
JRE: Java 11
-cp: -cp code
-ea: -ea -Drhn.config.dir=$MODULE_DIR$/../buildconf/test/ -Dlog4j.threshold=debug

&lt;/pre&gt;
&lt;p&gt;Select &amp;quot;All in package&amp;quot; to execute all available Unittests, if you want to limit to a specific class or package adjust the dropdown and filepath accordingly&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;To start the JUnit tests, click on &lt;strong&gt;Run &amp;gt; Run&lt;/strong&gt;.&lt;/p&gt;
&lt;p&gt;&lt;em&gt;Important: Start the test database docker container first, otherwise almost all tests will just fail&lt;/em&gt;&lt;/p&gt;
&lt;pre class="code text literal-block"&gt;
cd &amp;lt;path_to_uyuni_root&amp;gt;/java
make -f Makefile.docker dockerrun_pg

&lt;/pre&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class="section" id="deploying-java-code-or-css"&gt;
&lt;h2&gt;&lt;a class="toc-backref" href="#toc-entry-17"&gt;Deploying Java code or CSS&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;If you created a terraform based VM with sumaform, you can easily deploy code:&lt;/p&gt;
&lt;ol class="arabic simple"&gt;
&lt;li&gt;Run checkstyle&lt;/li&gt;
&lt;/ol&gt;
&lt;pre class="code text literal-block"&gt;
cd &amp;lt;path_to_uyuni_root&amp;gt;/java
ant -f manager-build.xml checkstyle

&lt;/pre&gt;
&lt;ol class="arabic simple" start="2"&gt;
&lt;li&gt;Deploy&lt;/li&gt;
&lt;/ol&gt;
&lt;pre class="code text literal-block"&gt;
cd &amp;lt;path_to_uyuni_root&amp;gt;/java
ant -f manager-build.xml refresh-branding-jar deploy -Ddeploy.host=uyuni-server.tf.local restart-tomcat restart-taskomatic

&lt;/pre&gt;
&lt;p&gt;You can configure the &lt;em&gt;deploy.host&lt;/em&gt; in &lt;code&gt;&amp;lt;path_to_uyuni_root&amp;gt;/java/buildconf/manager-developer-build.properties&lt;/code&gt;
and omit the command line parameter.&lt;/p&gt;
&lt;/div&gt;
&lt;div class="section" id="contribute"&gt;
&lt;h2&gt;&lt;a class="toc-backref" href="#toc-entry-18"&gt;Contribute&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;&lt;a class="reference external" href="https://www.uyuni-project.org"&gt;Uyuni&lt;/a&gt; exist since July 2018, the initial release (4.0.0) was based on SUSE Manager 3.2, since
then Uyuni is the Upstream Project of SUSE Manager. SUSE Manager is based on Spacewalk, which was sponsored by Red Hat and
abandoned, so SUSE decided to start a own &lt;a class="reference external" href="https://news.opensuse.org/2018/05/26/uyuni-forking-spacewalk-with-salt-and-containers/"&gt;Fork&lt;/a&gt;
(Archive: &lt;a class="reference external" href="https://web.archive.org/web/20210418110047/https://news.opensuse.org/2018/05/26/uyuni-forking-spacewalk-with-salt-and-containers/"&gt;[1]&lt;/a&gt;,
&lt;a class="reference external" href="https://archive.today/2022.03.09-211509/https://news.opensuse.org/2018/05/26/uyuni-forking-spacewalk-with-salt-and-containers/"&gt;[2]&lt;/a&gt;), Uyuni was born.&lt;/p&gt;
&lt;p&gt;Still a lot of development comes from SUSE but there is a growing &lt;a class="reference external" href="https://www.uyuni-project.org/pages/contact.html"&gt;Community&lt;/a&gt;
(Archive: &lt;a class="reference external" href="https://web.archive.org/web/20220309221253/https://www.uyuni-project.org/pages/contact.html"&gt;[1]&lt;/a&gt;,
&lt;a class="reference external" href="https://archive.today/2022.03.09-221014/https://www.uyuni-project.org/pages/contact.html"&gt;[2]&lt;/a&gt;)
with more and more independent Contributions.&lt;/p&gt;
&lt;p&gt;If your dev environment is ready and you want to jump in, but didn't contributed to the Uyuni Project before,
I suggest you take a look at some &lt;a class="reference external" href="https://github.com/uyuni-project/uyuni/issues?q=is%3Aissue+is%3Aopen+label%3A%22good+first+issue%22"&gt;Good first Issues&lt;/a&gt;.&lt;/p&gt;
&lt;/div&gt;
</content><category term="Code"/><category term="Uyuni"/><category term="Java"/><category term="Development"/><category term="sumaform"/><category term="IntelliJ"/></entry><entry><title>Create BMC Control-M usage reports from CLI instead GUI</title><link href="https://dominik.wombacher.cc/posts/create-bmc-control-m-usage-reports-via-cli-instead-gui.html" rel="alternate"/><published>2021-08-21T00:00:00+02:00</published><updated>2021-08-21T00:00:00+02:00</updated><author><name>Dominik Wombacher</name></author><id>tag:dominik.wombacher.cc,2021-08-21:/posts/create-bmc-control-m-usage-reports-via-cli-instead-gui.html</id><summary type="html">&lt;!-- SPDX-FileCopyrightText: 2023 Dominik Wombacher &lt;dominik@wombacher.cc&gt; --&gt;
&lt;!--  --&gt;
&lt;!-- SPDX-License-Identifier: CC-BY-SA-4.0 --&gt;
&lt;p&gt;I had to solve a quite interesting problem recently, the Task was to generate Control-M usage reports on a monthly basis and send them via E-Mail.&lt;/p&gt;
&lt;p&gt;Control-M provides a Solution  ... &lt;a class="read-more" href="/posts/create-bmc-control-m-usage-reports-via-cli-instead-gui.html"&gt; [read more]&lt;/a&gt;&lt;/p&gt;</summary><content type="html">&lt;!-- SPDX-FileCopyrightText: 2023 Dominik Wombacher &lt;dominik@wombacher.cc&gt; --&gt;
&lt;!--  --&gt;
&lt;!-- SPDX-License-Identifier: CC-BY-SA-4.0 --&gt;
&lt;p&gt;I had to solve a quite interesting problem recently, the Task was to generate Control-M usage reports on a monthly basis and send them via E-Mail.&lt;/p&gt;
&lt;p&gt;Control-M provides a Solution for that: &lt;strong&gt;BMC Control-M Usage Reporting Tool&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;But it's a Java GUI Application that can't be automated or run in Batch mode. So I decided to write a small &amp;quot;wrapper&amp;quot; in Java which re-use the original Classes from the Control-M Usage Reporting Tool (Version 9.0.00).&lt;/p&gt;
&lt;p&gt;That way the results are 100% identical without any (unsupported) customizing but it can be executed from the command line.&lt;/p&gt;
&lt;p&gt;I want to make clear: All Control-M Copyrights belong to BMC, including the Java Code and Classes. All what my little wrapper does, is loading the Class which comes with the original Tool and call the same methods as it would be done in the GUI to generate the report.&lt;/p&gt;
&lt;p&gt;Therefore I want to share the Code of my wrapper and the necessary cmd file (yes, all this is only running on Windows due to hardcoded backslashes in file paths in the used Class) to start it.&lt;/p&gt;
&lt;p&gt;Downloading the required Jar file from BMC, Building the Project (I used &amp;quot;Export: Runnable JAR file&amp;quot; in Eclipse), adding the necessary &lt;em&gt;data/env.txt&lt;/em&gt; and &lt;em&gt;data/config.ini&lt;/em&gt; is up to you.
I suggest you take a look into the directory structure and files of the &lt;em&gt;BMC Control-M Usage Reporting Tool&lt;/em&gt;, it isn't that hard figure it out and get it working :)&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;ctmusagereport&lt;/strong&gt;&lt;/p&gt;
&lt;pre class="code java literal-block"&gt;
&lt;span class="pygments-kn"&gt;package&lt;/span&gt;&lt;span class="pygments-w"&gt; &lt;/span&gt;&lt;span class="pygments-nn"&gt;ctmusagereport&lt;/span&gt;&lt;span class="pygments-p"&gt;;&lt;/span&gt;&lt;span class="pygments-w"&gt;
&lt;/span&gt;&lt;span class="pygments-kn"&gt;import&lt;/span&gt;&lt;span class="pygments-w"&gt; &lt;/span&gt;&lt;span class="pygments-nn"&gt;java.io.File&lt;/span&gt;&lt;span class="pygments-p"&gt;;&lt;/span&gt;&lt;span class="pygments-w"&gt;
&lt;/span&gt;&lt;span class="pygments-kn"&gt;import&lt;/span&gt;&lt;span class="pygments-w"&gt; &lt;/span&gt;&lt;span class="pygments-nn"&gt;com.bmc.ctmem.usagetool.Enhancement.ZipFiles&lt;/span&gt;&lt;span class="pygments-p"&gt;;&lt;/span&gt;&lt;span class="pygments-w"&gt;
&lt;/span&gt;&lt;span class="pygments-kn"&gt;import&lt;/span&gt;&lt;span class="pygments-w"&gt; &lt;/span&gt;&lt;span class="pygments-nn"&gt;com.bmc.ctmem.usagetool.dbaccess.AddOnsReport&lt;/span&gt;&lt;span class="pygments-p"&gt;;&lt;/span&gt;&lt;span class="pygments-w"&gt;
&lt;/span&gt;&lt;span class="pygments-kn"&gt;import&lt;/span&gt;&lt;span class="pygments-w"&gt; &lt;/span&gt;&lt;span class="pygments-nn"&gt;com.bmc.ctmem.usagetool.dbaccess.DBAccess&lt;/span&gt;&lt;span class="pygments-p"&gt;;&lt;/span&gt;&lt;span class="pygments-w"&gt;
&lt;/span&gt;&lt;span class="pygments-kn"&gt;import&lt;/span&gt;&lt;span class="pygments-w"&gt; &lt;/span&gt;&lt;span class="pygments-nn"&gt;com.bmc.ctmem.usagetool.dbaccess.DBAccessManager&lt;/span&gt;&lt;span class="pygments-p"&gt;;&lt;/span&gt;&lt;span class="pygments-w"&gt;
&lt;/span&gt;&lt;span class="pygments-kn"&gt;import&lt;/span&gt;&lt;span class="pygments-w"&gt; &lt;/span&gt;&lt;span class="pygments-nn"&gt;com.bmc.ctmem.usagetool.dbaccess.EndpointReport&lt;/span&gt;&lt;span class="pygments-p"&gt;;&lt;/span&gt;&lt;span class="pygments-w"&gt;
&lt;/span&gt;&lt;span class="pygments-kn"&gt;import&lt;/span&gt;&lt;span class="pygments-w"&gt; &lt;/span&gt;&lt;span class="pygments-nn"&gt;com.bmc.ctmem.usagetool.dbaccess.JobCountReport&lt;/span&gt;&lt;span class="pygments-p"&gt;;&lt;/span&gt;&lt;span class="pygments-w"&gt;
&lt;/span&gt;&lt;span class="pygments-kn"&gt;import&lt;/span&gt;&lt;span class="pygments-w"&gt; &lt;/span&gt;&lt;span class="pygments-nn"&gt;com.bmc.ctmem.usagetool.dbaccess.Params&lt;/span&gt;&lt;span class="pygments-p"&gt;;&lt;/span&gt;&lt;span class="pygments-w"&gt;
&lt;/span&gt;&lt;span class="pygments-kd"&gt;public&lt;/span&gt;&lt;span class="pygments-w"&gt; &lt;/span&gt;&lt;span class="pygments-kd"&gt;class&lt;/span&gt; &lt;span class="pygments-nc"&gt;Main&lt;/span&gt;&lt;span class="pygments-w"&gt; &lt;/span&gt;&lt;span class="pygments-p"&gt;{&lt;/span&gt;&lt;span class="pygments-w"&gt;
    &lt;/span&gt;&lt;span class="pygments-kd"&gt;public&lt;/span&gt;&lt;span class="pygments-w"&gt; &lt;/span&gt;&lt;span class="pygments-kd"&gt;static&lt;/span&gt;&lt;span class="pygments-w"&gt; &lt;/span&gt;&lt;span class="pygments-kt"&gt;void&lt;/span&gt;&lt;span class="pygments-w"&gt; &lt;/span&gt;&lt;span class="pygments-nf"&gt;main&lt;/span&gt;&lt;span class="pygments-p"&gt;(&lt;/span&gt;&lt;span class="pygments-n"&gt;String&lt;/span&gt;&lt;span class="pygments-o"&gt;[]&lt;/span&gt;&lt;span class="pygments-w"&gt; &lt;/span&gt;&lt;span class="pygments-n"&gt;args&lt;/span&gt;&lt;span class="pygments-p"&gt;)&lt;/span&gt;&lt;span class="pygments-w"&gt; &lt;/span&gt;&lt;span class="pygments-p"&gt;{&lt;/span&gt;&lt;span class="pygments-w"&gt;
        &lt;/span&gt;&lt;span class="pygments-c1"&gt;// Used to Load Env and Config File also to Generate and Get Report Directory&lt;/span&gt;&lt;span class="pygments-w"&gt;
        &lt;/span&gt;&lt;span class="pygments-n"&gt;Params&lt;/span&gt;&lt;span class="pygments-w"&gt; &lt;/span&gt;&lt;span class="pygments-n"&gt;par&lt;/span&gt;&lt;span class="pygments-w"&gt; &lt;/span&gt;&lt;span class="pygments-o"&gt;=&lt;/span&gt;&lt;span class="pygments-w"&gt; &lt;/span&gt;&lt;span class="pygments-n"&gt;Params&lt;/span&gt;&lt;span class="pygments-p"&gt;.&lt;/span&gt;&lt;span class="pygments-na"&gt;instance&lt;/span&gt;&lt;span class="pygments-p"&gt;();&lt;/span&gt;&lt;span class="pygments-w"&gt;
        &lt;/span&gt;&lt;span class="pygments-k"&gt;try&lt;/span&gt;&lt;span class="pygments-w"&gt; &lt;/span&gt;&lt;span class="pygments-p"&gt;{&lt;/span&gt;&lt;span class="pygments-w"&gt;
            &lt;/span&gt;&lt;span class="pygments-n"&gt;par&lt;/span&gt;&lt;span class="pygments-p"&gt;.&lt;/span&gt;&lt;span class="pygments-na"&gt;LoadEMEnvironmentsFromFile&lt;/span&gt;&lt;span class="pygments-p"&gt;();&lt;/span&gt;&lt;span class="pygments-w"&gt;
        &lt;/span&gt;&lt;span class="pygments-p"&gt;}&lt;/span&gt;&lt;span class="pygments-w"&gt; &lt;/span&gt;&lt;span class="pygments-k"&gt;catch&lt;/span&gt;&lt;span class="pygments-w"&gt; &lt;/span&gt;&lt;span class="pygments-p"&gt;(&lt;/span&gt;&lt;span class="pygments-n"&gt;Exception&lt;/span&gt;&lt;span class="pygments-w"&gt; &lt;/span&gt;&lt;span class="pygments-n"&gt;e&lt;/span&gt;&lt;span class="pygments-p"&gt;)&lt;/span&gt;&lt;span class="pygments-w"&gt; &lt;/span&gt;&lt;span class="pygments-p"&gt;{&lt;/span&gt;&lt;span class="pygments-w"&gt;
            &lt;/span&gt;&lt;span class="pygments-n"&gt;e&lt;/span&gt;&lt;span class="pygments-p"&gt;.&lt;/span&gt;&lt;span class="pygments-na"&gt;printStackTrace&lt;/span&gt;&lt;span class="pygments-p"&gt;();&lt;/span&gt;&lt;span class="pygments-w"&gt;
        &lt;/span&gt;&lt;span class="pygments-p"&gt;}&lt;/span&gt;&lt;span class="pygments-w"&gt;
        &lt;/span&gt;&lt;span class="pygments-k"&gt;try&lt;/span&gt;&lt;span class="pygments-w"&gt; &lt;/span&gt;&lt;span class="pygments-p"&gt;{&lt;/span&gt;&lt;span class="pygments-w"&gt;
            &lt;/span&gt;&lt;span class="pygments-n"&gt;par&lt;/span&gt;&lt;span class="pygments-p"&gt;.&lt;/span&gt;&lt;span class="pygments-na"&gt;LoadConfigParamFromFile&lt;/span&gt;&lt;span class="pygments-p"&gt;();&lt;/span&gt;&lt;span class="pygments-w"&gt;
        &lt;/span&gt;&lt;span class="pygments-p"&gt;}&lt;/span&gt;&lt;span class="pygments-w"&gt; &lt;/span&gt;&lt;span class="pygments-k"&gt;catch&lt;/span&gt;&lt;span class="pygments-w"&gt; &lt;/span&gt;&lt;span class="pygments-p"&gt;(&lt;/span&gt;&lt;span class="pygments-n"&gt;Exception&lt;/span&gt;&lt;span class="pygments-w"&gt; &lt;/span&gt;&lt;span class="pygments-n"&gt;e&lt;/span&gt;&lt;span class="pygments-p"&gt;)&lt;/span&gt;&lt;span class="pygments-w"&gt; &lt;/span&gt;&lt;span class="pygments-p"&gt;{&lt;/span&gt;&lt;span class="pygments-w"&gt;
            &lt;/span&gt;&lt;span class="pygments-n"&gt;e&lt;/span&gt;&lt;span class="pygments-p"&gt;.&lt;/span&gt;&lt;span class="pygments-na"&gt;printStackTrace&lt;/span&gt;&lt;span class="pygments-p"&gt;();&lt;/span&gt;&lt;span class="pygments-w"&gt;
        &lt;/span&gt;&lt;span class="pygments-p"&gt;}&lt;/span&gt;&lt;span class="pygments-w"&gt;

        &lt;/span&gt;&lt;span class="pygments-c1"&gt;// Initiates DB Connection based on values in data/env.txt&lt;/span&gt;&lt;span class="pygments-w"&gt;
        &lt;/span&gt;&lt;span class="pygments-n"&gt;DBAccessManager&lt;/span&gt;&lt;span class="pygments-w"&gt; &lt;/span&gt;&lt;span class="pygments-n"&gt;dbam&lt;/span&gt;&lt;span class="pygments-w"&gt; &lt;/span&gt;&lt;span class="pygments-o"&gt;=&lt;/span&gt;&lt;span class="pygments-w"&gt; &lt;/span&gt;&lt;span class="pygments-n"&gt;DBAccessManager&lt;/span&gt;&lt;span class="pygments-p"&gt;.&lt;/span&gt;&lt;span class="pygments-na"&gt;instance&lt;/span&gt;&lt;span class="pygments-p"&gt;();&lt;/span&gt;&lt;span class="pygments-w"&gt;
        &lt;/span&gt;&lt;span class="pygments-n"&gt;dbam&lt;/span&gt;&lt;span class="pygments-p"&gt;.&lt;/span&gt;&lt;span class="pygments-na"&gt;RefreshDBAccessManager&lt;/span&gt;&lt;span class="pygments-p"&gt;();&lt;/span&gt;&lt;span class="pygments-w"&gt;

        &lt;/span&gt;&lt;span class="pygments-c1"&gt;// Get DB Connection for Environment 0 (first line in env file)&lt;/span&gt;&lt;span class="pygments-w"&gt;
        &lt;/span&gt;&lt;span class="pygments-n"&gt;DBAccess&lt;/span&gt;&lt;span class="pygments-w"&gt; &lt;/span&gt;&lt;span class="pygments-n"&gt;con&lt;/span&gt;&lt;span class="pygments-w"&gt; &lt;/span&gt;&lt;span class="pygments-o"&gt;=&lt;/span&gt;&lt;span class="pygments-w"&gt; &lt;/span&gt;&lt;span class="pygments-n"&gt;dbam&lt;/span&gt;&lt;span class="pygments-p"&gt;.&lt;/span&gt;&lt;span class="pygments-na"&gt;GetDBAccess&lt;/span&gt;&lt;span class="pygments-p"&gt;(&lt;/span&gt;&lt;span class="pygments-mi"&gt;0&lt;/span&gt;&lt;span class="pygments-p"&gt;);&lt;/span&gt;&lt;span class="pygments-w"&gt;
        &lt;/span&gt;&lt;span class="pygments-n"&gt;con&lt;/span&gt;&lt;span class="pygments-p"&gt;.&lt;/span&gt;&lt;span class="pygments-na"&gt;GetEMVersionFromDB&lt;/span&gt;&lt;span class="pygments-p"&gt;();&lt;/span&gt;&lt;span class="pygments-w"&gt;

        &lt;/span&gt;&lt;span class="pygments-c1"&gt;// Creates new Directory in reports/ with datetime now (&amp;quot;yyyy-MM-dd-HHmmss&amp;quot;)&lt;/span&gt;&lt;span class="pygments-w"&gt;
        &lt;/span&gt;&lt;span class="pygments-n"&gt;par&lt;/span&gt;&lt;span class="pygments-p"&gt;.&lt;/span&gt;&lt;span class="pygments-na"&gt;CreateReportDir&lt;/span&gt;&lt;span class="pygments-p"&gt;();&lt;/span&gt;&lt;span class="pygments-w"&gt;

        &lt;/span&gt;&lt;span class="pygments-c1"&gt;// Trigger Generation of all Reports identical to GUI (Wizard / FlowManager)&lt;/span&gt;&lt;span class="pygments-w"&gt;
        &lt;/span&gt;&lt;span class="pygments-k"&gt;new&lt;/span&gt;&lt;span class="pygments-w"&gt; &lt;/span&gt;&lt;span class="pygments-n"&gt;JobCountReport&lt;/span&gt;&lt;span class="pygments-p"&gt;(&lt;/span&gt;&lt;span class="pygments-n"&gt;par&lt;/span&gt;&lt;span class="pygments-p"&gt;.&lt;/span&gt;&lt;span class="pygments-na"&gt;GetReportDirName&lt;/span&gt;&lt;span class="pygments-p"&gt;());&lt;/span&gt;&lt;span class="pygments-w"&gt;
        &lt;/span&gt;&lt;span class="pygments-k"&gt;new&lt;/span&gt;&lt;span class="pygments-w"&gt; &lt;/span&gt;&lt;span class="pygments-n"&gt;AddOnsReport&lt;/span&gt;&lt;span class="pygments-p"&gt;(&lt;/span&gt;&lt;span class="pygments-n"&gt;par&lt;/span&gt;&lt;span class="pygments-p"&gt;.&lt;/span&gt;&lt;span class="pygments-na"&gt;GetReportDirName&lt;/span&gt;&lt;span class="pygments-p"&gt;());&lt;/span&gt;&lt;span class="pygments-w"&gt;
        &lt;/span&gt;&lt;span class="pygments-k"&gt;new&lt;/span&gt;&lt;span class="pygments-w"&gt; &lt;/span&gt;&lt;span class="pygments-n"&gt;EndpointReport&lt;/span&gt;&lt;span class="pygments-p"&gt;(&lt;/span&gt;&lt;span class="pygments-n"&gt;par&lt;/span&gt;&lt;span class="pygments-p"&gt;.&lt;/span&gt;&lt;span class="pygments-na"&gt;GetReportDirName&lt;/span&gt;&lt;span class="pygments-p"&gt;(),&lt;/span&gt;&lt;span class="pygments-w"&gt; &lt;/span&gt;&lt;span class="pygments-kc"&gt;true&lt;/span&gt;&lt;span class="pygments-p"&gt;);&lt;/span&gt;&lt;span class="pygments-w"&gt;

        &lt;/span&gt;&lt;span class="pygments-c1"&gt;// For easier handling, add all generated files to &amp;quot;reports.zip&amp;quot; in Generated Report Directory&lt;/span&gt;&lt;span class="pygments-w"&gt;
        &lt;/span&gt;&lt;span class="pygments-n"&gt;File&lt;/span&gt;&lt;span class="pygments-o"&gt;[]&lt;/span&gt;&lt;span class="pygments-w"&gt; &lt;/span&gt;&lt;span class="pygments-n"&gt;fileReportsDir&lt;/span&gt;&lt;span class="pygments-w"&gt; &lt;/span&gt;&lt;span class="pygments-o"&gt;=&lt;/span&gt;&lt;span class="pygments-w"&gt; &lt;/span&gt;&lt;span class="pygments-k"&gt;new&lt;/span&gt;&lt;span class="pygments-w"&gt; &lt;/span&gt;&lt;span class="pygments-n"&gt;File&lt;/span&gt;&lt;span class="pygments-p"&gt;(&lt;/span&gt;&lt;span class="pygments-n"&gt;par&lt;/span&gt;&lt;span class="pygments-p"&gt;.&lt;/span&gt;&lt;span class="pygments-na"&gt;GetReportDirName&lt;/span&gt;&lt;span class="pygments-p"&gt;()).&lt;/span&gt;&lt;span class="pygments-na"&gt;listFiles&lt;/span&gt;&lt;span class="pygments-p"&gt;();&lt;/span&gt;&lt;span class="pygments-w"&gt;
        &lt;/span&gt;&lt;span class="pygments-n"&gt;ZipFiles&lt;/span&gt;&lt;span class="pygments-p"&gt;.&lt;/span&gt;&lt;span class="pygments-na"&gt;Zip&lt;/span&gt;&lt;span class="pygments-p"&gt;(&lt;/span&gt;&lt;span class="pygments-n"&gt;fileReportsDir&lt;/span&gt;&lt;span class="pygments-p"&gt;,&lt;/span&gt;&lt;span class="pygments-w"&gt; &lt;/span&gt;&lt;span class="pygments-n"&gt;par&lt;/span&gt;&lt;span class="pygments-p"&gt;.&lt;/span&gt;&lt;span class="pygments-na"&gt;GetReportDirName&lt;/span&gt;&lt;span class="pygments-p"&gt;());&lt;/span&gt;&lt;span class="pygments-w"&gt;
    &lt;/span&gt;&lt;span class="pygments-p"&gt;}&lt;/span&gt;&lt;span class="pygments-w"&gt;
&lt;/span&gt;&lt;span class="pygments-p"&gt;}&lt;/span&gt;&lt;span class="pygments-w"&gt;
&lt;/span&gt;
&lt;/pre&gt;
&lt;p&gt;&lt;strong&gt;ctmusagereport.cmd&lt;/strong&gt;&lt;/p&gt;
&lt;pre class="code text literal-block"&gt;
java -cp &amp;quot;./*;ctmusagereport_lib/*&amp;quot; ctmusagereport.Main

&lt;/pre&gt;
&lt;p&gt;I tested it successfully with &lt;em&gt;&amp;quot;OpenJDK11U-jdk_x64_windows_hotspot_11.0.12_7&amp;quot;&lt;/em&gt; from &lt;a class="reference external" href="https://adoptium.net/"&gt;https://adoptium.net/&lt;/a&gt; on Windows Server 2016.&lt;/p&gt;
&lt;p&gt;What I like about working with Control-M is that you can Script and Customize almost everything somehow, even worse that I had to find a workaround like that for the usage reporting, would be great if BMC would offer such an CLI option with the original Tool.&lt;/p&gt;
</content><category term="Code"/><category term="Control-M"/><category term="Code"/><category term="Java"/></entry><entry><title>How I prepared and failed the 1Z0-819 Java SE 11 Developer Exam</title><link href="https://dominik.wombacher.cc/posts/how-i-prepared-and-failed-the-1z0-819-java-se-11-developer-exam.html" rel="alternate"/><published>2021-04-20T00:00:00+02:00</published><updated>2021-04-20T00:00:00+02:00</updated><author><name>Dominik Wombacher</name></author><id>tag:dominik.wombacher.cc,2021-04-20:/posts/how-i-prepared-and-failed-the-1z0-819-java-se-11-developer-exam.html</id><summary type="html">&lt;!-- SPDX-FileCopyrightText: 2023 Dominik Wombacher &lt;dominik@wombacher.cc&gt; --&gt;
&lt;!--  --&gt;
&lt;!-- SPDX-License-Identifier: CC-BY-SA-4.0 --&gt;
&lt;p&gt;Yesterday I took the 1Z0-819 Exam and failed with a Score of 55% (Passing Score: 68%), but I'm not sad or disappointed, I wasn't just ready yet.&lt;/p&gt;
&lt;p&gt;I learned a  ... &lt;a class="read-more" href="/posts/how-i-prepared-and-failed-the-1z0-819-java-se-11-developer-exam.html"&gt; [read more]&lt;/a&gt;&lt;/p&gt;</summary><content type="html">&lt;!-- SPDX-FileCopyrightText: 2023 Dominik Wombacher &lt;dominik@wombacher.cc&gt; --&gt;
&lt;!--  --&gt;
&lt;!-- SPDX-License-Identifier: CC-BY-SA-4.0 --&gt;
&lt;p&gt;Yesterday I took the 1Z0-819 Exam and failed with a Score of 55% (Passing Score: 68%), but I'm not sad or disappointed, I wasn't just ready yet.&lt;/p&gt;
&lt;p&gt;I learned a lot during my preparation and it was one of the toughest Exams I ever tried, so it's not a big deal to fail on the first attempt.&lt;/p&gt;
&lt;p&gt;But why did I actually tried it? I learned some Java Basics many Years ago but never used it much. Also my IT Career isn't fully focused on Development, even though that's something I personally enjoy most.&lt;/p&gt;
&lt;p&gt;One of my colleagues told me about the 25th anniversary offer from Oracle, were you could get Access to a Java SE Developer OCP Online Training and attend the Exam for 25$. I always wanted to improve my Java Skills, so I thought that would be a great opportunity. But due to the timely limited offer, I just had roughly 4 weeks before I had to take the Exam.&lt;/p&gt;
&lt;p&gt;&lt;em&gt;Spoiler: A few weeks, even if you spend many hours every day, are not enough to get from zero to hero in Java and to pass 1Z0-819 ;)&lt;/em&gt;&lt;/p&gt;
&lt;p&gt;The included Online Training from Oracle wasn't that bad, but wasn't that good either. There were some Hands On Labs but the Guide wasn't provided, so you could only watch the Solution Videos, not perfect but to be fair, it was more or less for free.&lt;/p&gt;
&lt;p&gt;I checked out &lt;a class="reference external" href="https://www.reddit.com/r/learnjava/"&gt;learnjava on reddit&lt;/a&gt; and they mentioned &lt;a class="reference external" href="https://java-programming.mooc.fi"&gt;https://java-programming.mooc.fi&lt;/a&gt; what seem to be very popular learning resource. The University of Helsinki provides two Java Courses, most of the content in written form, with a customized NetBeans IDE Version that includes the Test my Content Plugin.&lt;/p&gt;
&lt;p&gt;The cool thing is, you just create an mooc.fi Account, Download the IDE and Login. Afterwards you can work through the Exercises, test them locally and upload them. If your Code is correct and pass all Tests, the Exercise will marked as completed in the Online Course.&lt;/p&gt;
&lt;p&gt;Actually that was one of my best learning experiences ever, because you have to solve the exercises on your own but due to the integrated testing, you can always check if you do the things right. During my Exam prep, mooc.fi was the most helpful resource.&lt;/p&gt;
&lt;p&gt;In addition the Mock Exams provided by &lt;a class="reference external" href="https://enthuware.com/java-certification-mock-exams/oracle-certified-professional/ocp-java-11-exam-1z0-819"&gt;enthuWare&lt;/a&gt; were quite nice and very cheap. And before you get confused, it's not about Braindumps, Mock Exams are something different.&lt;/p&gt;
&lt;p&gt;During the Exam you have to read and interpret a lot of Code and then choose the right answer(s). So you have to fully understand the Topics and can't just learn Questions and Answers. The Mock Exams can help you to get a feeling how the style of the real exam will be.&lt;/p&gt;
&lt;p&gt;For me enthuWare was a good addition to the other resources, also I think it was sometimes harder than the real Exam.&lt;/p&gt;
&lt;p&gt;If you prefer learning from a Book, I suggest you take a look at &lt;a class="reference external" href="https://www.selikoff.net/ocp11-complete/"&gt;Java OCP 11 Developer Complete Study Guide&lt;/a&gt;, it's still usable for &lt;a class="reference external" href="https://www.selikoff.net/ocp11-819"&gt;the 1Z0-819 Exam&lt;/a&gt;. I didn't used it myself, but lot of People recommend it, so I will give it a try next time :)&lt;/p&gt;
&lt;p&gt;I definitely plan to give it a second shot end of this Year and overall spent more time programming Java. I'm still very interested in Contributing to the &lt;a class="reference external" href="https://github.com/uyuni-project/uyuni"&gt;Uyuni Project&lt;/a&gt;, were lot of the Codebase is Java, so that might be part my Exam Prep too.&lt;/p&gt;
</content><category term="Code"/><category term="Java"/><category term="Exam"/><category term="Certification"/></entry></feed>