Java приложение для windows что это

By Dana Nourie, October 2006

As you learn the details and syntax of the Java programming language, a question begins to emerge: Which Java technologies do I need to create a desktop application, and which packages should I import? The answer depends on what kind of application you are building and what it does.

This article is aimed at developers new to Java technologies. It describes the technologies involved in creating various types of desktop applications and when you might decide to use them. Watch for future articles that will give details about how to use these technologies and how to use them together. In the meantime, you can get started learning some of the technologies by following links within this article.

To use any of the technologies in this article, you must have the Java platform installed on your computer.

The Type, Look, and Function of Your Desktop Application

Before you read about the many Java technologies available, you must understand who will use your application, how they will use it, whether it will reside on an individual machine or on a network, as well as what kind of look or graphical user interface (GUI) the application will have — if any.

Before you create an application, consider the five following areas:

  • The application’s distribution
  • The GUI or lack of a GUI
  • The application’s functionalities
  • Deployment of the application
  • Other Java technologies

The Application’s Distribution

First, you must decide whether your application will be distributed. A distributed application is a program that runs on more than one computer and communicates through a network. Some distributed applications are two separate software programs: the back-end server software and the front-end client software. Back-end software runs on a shared system, such as the Solaris Operating Environment or Linux, and manages shared resources, such as disks, printers, and modems. The back-end software also contains the main processing capability for the application. The front-end client software runs on workstations or individual computers. It is what users see when they use the application. The front-end client software handles user interface functions, such as receiving input from a keyboard and displaying output to a screen.

Distributed applications can be simple, requiring a single client computer and a single server, or more complex, allowing many client computers and several servers. Nondistributed applications run on the local machine and do not need to access back-end servers. You might write a simple calculator program, for instance, that might run only locally, though you can also make these kinds of applications distributed.

Very often, applications you create will be distributed programs and will run on networks or on the Internet for many computers to use.

To create distributed applications, you will need to learn about and use Java Remote Method Invocation (Java RMI), in which the methods of remote Java objects can be invoked from other Java virtual machines (JVMs), * possibly on different hosts. Java RMI uses object serialization to marshal and unmarshal parameters and does not truncate types, supporting true object-oriented polymorphism.

Following are some of the packages you will use to implement Java RMI:

  • java.rmi
  • java.rmi.activation
  • java.rmi.dgc
  • java.rmi.registry
  • java.rmi.server

Notice that the following package names start with javax, not java:

  • javax.rmi
  • javax.rmi.CORBA
  • javax.rmi.ssl

For background information and instruction on using Java RMI, read the Java RMI lesson in the Java Tutorial.

The GUI or Lack of GUI

Applications generally contain many miniprograms with various functions. Some miniprograms have a graphical user interface (GUI), if only a simple window or dialog box, and many miniprograms have no GUI. The application itself, however, is likely to have a main GUI that consists of menus, buttons, tool bars, text fields, and other graphical features. The GUI is mainly for user input, whether the user clicks a button or types in information, and a GUI can provide the user with additional information. In addition, GUI components often display information back to the user.

To create the GUI, you use the Java Foundation Classes/Swing (JFC/Swing) and Abstract Window Toolkit (AWT) API. The many classes and interfaces in those packages allow you to easily create buttons, check-box objects, text fields, and other components, as well as components to organize them.

By far the easiest way to create the frame and all the GUI components for your application is to use an integrated development environment (IDE), such as the NetBeans IDE. This IDE allows you to drag and drop your components into place while it writes the complex component code for you. It’s easy to learn and saves you a lot of time. But every developer must understand how the JFC/Swing and AWT code works, so you should learn to program enough components by hand to understand the concepts.

Table 1: Main Packages to Use for GUI Programs

Of course, you don’t have to import all of these packages, just the ones you use. If you use the NetBeans IDE, you will find that this IDE creates import statements in your code as you use JFC/Swing or AWT components. You can get a good idea of what many of these packages do just from their names.

To download the latest version of the NetBeans IDE, go to the NetBeans IDE downloads page.

To get started using the NetBeans IDE, see the NetBeans IDE 5.0 Quick Start Guide.

To begin learning how to code using JFC/Swing, see the lesson A Brief Introduction to the Swing Package in the Java Tutorial.

The Application’s Functionalities

This article cannot discuss every functionality that you might use in your application, but some functionalities are common to many or most applications.

To get buttons, menus, and text fields to do something in your GUI, you will need to understand how event handling works. An event handler is a class that contains the instructions for what should happen when the user pushes a button or selects a menu. From there, a number of operations can take place: The application can display information back to the GUI, write data to files or a database, do math operations and show the results in bar graphs, or do something as simple as open a dialog box for the user to enter more information.

For more information on how to code GUI applications, see What Is Swing? in the Java Tutorial. You can learn how to create and use JFC/Swing components, write event handlers, and more.

Reading and Writing Data

Writing user input to a flat file system is a common operation in applications, as is reading from a file to write back to the GUI. For instance, a user may enter a name, address, and phone number into a GUI form to register the software on a server. One way of handling this data is to have the application write the data to a file on a host computer or a server.

The java.io package provides for system input and output (I/O) through data streams, serialization, and the file system. An I/O stream represents an input source or an output destination. A stream can represent many different kinds of sources and destinations, including disk files, devices, other programs, and memory arrays. Streams support many different kinds of data, including simple bytes, primitive data types, localized characters, and objects. Some streams simply pass on data, whereas others manipulate and transform the data in useful ways.

No matter how they work internally, all streams present the same simple model to programs that use them: A stream is a sequence of data. Two of the more popular classes used in the java.io package are FileInputStream and FileOutputStream . Both create byte streams linked to files. To learn more about streams, see I/O Streams in the Java Tutorial.

A common approach to storing data is to use a database management system. To code your application to write data to a database and then retrieve the results, you will need to learn the JDBC API. The JDBC API provides universal data access from the Java programming language, allowing you to access virtually any data source — from relational databases to spreadsheets and flat files. JDBC technology also provides a common base on which to build tools and alternate interfaces.

The JDBC API supports both two-tier and three-tier models for database access.

In the two-tier model, a Java applet or application talks directly to the data source. This requires a JDBC technology driver that can communicate with the particular data source that the application accesses. A user’s commands are delivered to the database or other data source, and the results of those statements are sent back to the user. The data source may be located on another machine that the user is connected to by way of a network. This is referred to as a client-server configuration: The user’s machine is the client, and the machine housing the data source is the server. The network can be a company intranet, for example, which connects employees within a company, or it can be the Internet.

In the three-tier model, the application sends commands to a middle tier of services, which then sends the commands to the data source. The data source processes the commands and sends the results back to the middle tier, which then sends them to the user. Management information system (MIS) directors find the three-tier model very attractive because the middle tier makes it possible to maintain control over access and the kinds of updates that can be made to corporate data. Another advantage is that the three-tier model simplifies the deployment of applications. For instance, data can be changed in a database or new components added without interfering with the user experience. Finally, in many cases, the three-tier architecture can provide performance advantages because multiple transactions and memory are more efficient.

For writing applications that access a database using the JDBC API, you will use the following:

  • Classes and interfaces from the java.sql package.
  • A database management system, such as the Java DB database system. You can also download Java DB with the Sun Java System Application Server Platform Edition 9 as part of the Java EE download.
  • The appropriate drivers for your database management system.

To learn more about using the JDBC API in your application, see Getting Started With the JDBC API.

To download a server and database, as well as an IDE to write the application, go to the NetBeans IDE 5.0 download page.

Performing Calculations and Managing Data

Much of your application contains code for instructions that must occur behind the scenes. You will likely do a lot of programming using strings and numbers. Because you must type all data in the Java programming language, you should be familiar with using the java.lang package.

In the java.lang package, you should understand strings, a sequence of characters. Strings are widely used in Java technology programming. The String class is used to create and manipulate strings, as is the StringBuilder class.

You should also become familiar with the Number class and its subclasses in the java.lang package, which enable you to use instantiations of these classes rather than the primitive number types. The PrintStream and DecimalFormat classes provide methods for writing formatted numerical output. Finally, the Math class contains mathematical functions to complement the operators built into the language. This class has methods for trigonometric functions, exponential functions, and so on.

In order to handle or manipulate various types of data, you will need to learn about the collections framework, a unified architecture for representing and manipulating collections. A collection, sometimes called a container, is an object that groups multiple elements into a single unit. Collections are used to store, retrieve, manipulate, and communicate aggregate data. Typically, collections represent data items that form a natural group, such as a poker hand, a collection of cards, a mail folder, a collection of letters, or a telephone directory that maps names to phone numbers.

Figure 1 shows the collection framework and some of the popular interfaces involved and found in the java.util package.

Core Collection interfaces are the foundation of the collections framework. A Set is a special kind of Collection, a SortedSet is a special kind of Set, and so forth. Note also that the hierarchy consists of two distinct trees. A Map is not a true Collection even though it is used in similar fashion as a collection. The Map interface provides three collection views, which allow a map’s contents to be viewed as a set of keys, collection of values, or set of key-value mappings.

Concurrency

Applications must often do more than one thing at a time. For example, a streaming audio application must simultaneously read the digital audio off the network, decompress it, manage playback, and update its display to the user. A word processing program should always be ready to respond to keyboard and mouse events, no matter how busy it is reformatting text or updating the display. Software that can do such things is known as concurrent software.

Basic currency support is available in the java.util.concurrent package.

Error Handling

The Java programming language uses exceptions to handle errors and other unexpected events. An exception is an event that occurs during the execution of a program and that disrupts the normal flow of the program’s instructions. When an error occurs within a method, the method creates an object and hands it off to the runtime system. The object, called an exception object, contains information about the error, including its type and the state of the program when the error occurred. Creating an exception object and handing it to the runtime system is known as throwing an exception.

To handle the exceptions in your application, you will need to understand how to write your code so that the application can catch or throw an exception. You can learn all the details about exception handling in the Exceptions lesson in the Java Tutorial.

Deployment of the Application

Use Java Plug-in technology to deploy applets when you want your application to run within a browser or when the application is tightly integrated with web page content. When you want your application to stand alone on the user’s desktop.

Java Web Start technology requires that applications be packed in Java Archive (JAR) files. The JAR file format enables you to bundle multiple files into a single archive file. Typically, a JAR file contains the class files and auxiliary resources associated with applets and applications.

JAR files are packaged with the ZIP file format, so you can use them for tasks such as lossless data compression, archiving, decompression, and archive unpacking. These tasks are among the most common uses of JAR files, and you will discover many of the benefits of the JAR file by using only these basic features.

If you want to take advantage of advanced functionality provided by the JAR file format, such as electronic signing, you will first need to become familiar with the fundamental operations. To perform basic tasks with JAR files, you use the JAR tool provided as part of the Java Development Kit (JDK). The lesson Using JAR Files: The Basics in the Java Tutorial explains the details of using the JAR tool.

Once you have your application packaged in a JAR file, you can use Java Web Start technology to deploy the application. Java Web Start software provides the power to launch full-featured applications with a single click. The user can download and launch applications, such as a complete spreadsheet program or an Internet chat client, without going through complicated installation procedures.

Instead, with Java Web Start software, the user launches a Java technology-based application by clicking a link in a web page. The link points to a Java Network Launching Protocol (JNLP) file, which instructs the Java Web Start software to download, cache, and run the application.

To learn the details of using Java Web Start software to deploy your application, read the Java Web Start software lesson in the Java Tutorial.

Other Java Technologies

This section will discuss some other Java technologies you should consider.

Application Security

Most developers are very concerned with application security, and Java technologies help address this concern in many ways. Java security technology includes a large set of APIs, tools, and implementations of commonly used security algorithms, mechanisms, and protocols. The Java platform security APIs span a wide range of areas, including cryptography, public key infrastructure, secure communication, authentication, and access control. Java security technology provides you with a comprehensive security framework for writing applications, and it also provides the user or administrator with a a set of tools to securely manage applications.

There are too many security packages and classes to list here, but several excellent sources can get you started learning about application security using Java technologies. See the Security page for a list of programmer’s guides, API specifications, tools, and tutorials. Additionally, you can visit the Java SE Security page, which includes many links to articles, white papers, and other information.

Full-Screen Exclusive Mode API

If you need high performance graphics in your application, for programs such as games or slide shows, then you should learn about the Full-Screen Exclusive Mode API. Full-screen exclusive mode is a powerful new feature that enables you to suspend the windowing system so that the application can draw directly to the screen. The Full-Screen Exclusive Mode API lesson in the Java Tutorial teaches you everything you need to know about using this API.

Internationalization

Internationalization is the process of designing an application so that it can be adapted to various languages and regions without engineering changes. Sometimes the term internationalization is abbreviated as i18n, because there are 18 letters between the first and the last letters. The Internationalization trail in the Java Tutorial teaches you what you need to know about internationalization and localization. Localization, often abbreviated as L10N, is the process of adapting software for a specific region or language by adding locale-specific components and translating text. The package you will use most for internationalization is java.util . For additional information, see the Core Java Internationalization page.

Summary

The sheer number of Java technologies available can be confusing, but this article gives you a head start on the ones you will need to learn to develop the kind of desktop applications you want. If you want your applications to have certain functionalities, you are likely to find a well-developed Java technology to help you program the features you need.

To find a succinct list of Java technologies and learn what they are for, see the article » Unraveling Java Terminology.» This article defines the most common Java terms and provides links for more information and downloads. In addition, you can see how the technologies fit together and get to their documentation quickly through the Java SE 6 Platform at a Glance page.

Look for instructions on how to use these Java technologies for application development in future issues of Java Technology Fundamentals newsletter and in the New to Java Programming Center.

* As used on this web site, the terms «Java virtual machine» or «JVM» mean a virtual machine for the Java platform.

For More Information

  • Download the Java platform
  • Lesson: Java Remote Method Invocation (Java RMI)
  • What Is an Exception?
  • Lesson: Concurrency
  • I/O Streams
  • Lesson: Introduction to Collections
  • Lesson: Writing Event Listeners
  • Lesson: Java Web Start

Если вы увидели Java в списке установленных программ, но не знаете, зачем она нужна – эта статья для вас. Многие пользователи спрашивают, зачем нужна Java на компьютере или ноутбуке, как она установилась, и что она делает. Давайте разбираться.

Java – это бесплатная платформа, которая предназначена для запуска приложений, написанных на одноименном языке программирования Java. Многие программы и веб-приложения работают на Java. Что из себя представляет эта платформа?

На компьютеры обычных пользователей чаще всего устанавливается JRE – Java Runtime Environment. Грубо говоря, это контейнер, внутри которого запускаются и работают Java программы. Он обеспечивает безопасность, стабильность и окружение для некоторой части софта на вашем компьютере.

Раньше Java активно использовали для написания “апплетов” – небольших приложений, работающих прямо в браузере. Например календарь, гостевая книга или онлайн чат. Сейчас для этих целей используется JavaScript, который не требует наличия установленной Java. Но все же много сайтов в бездонном Интернете работают на этой технологии. И если у вас нет Java, тогда такие сайты не смогут корректно работать и вы не сможете взаимодействовать с ними. Сайт не реагирует на ваши действия? Возможно причина кроется в отсутствии Java.

Более широко Java использовали и используют для создания настольных приложений. Потому некоторые программы просто не смогут работать без установленной Java. Например, популярная игра Minecraft работает исключительно внутри виртуальной “машины” Java. А если вы занимаетесь программированием, то для запуска некоторых IDE (сред для разработки ПО) тоже нужна Java.

Откуда Java на моем компьютере?

Java часто устанавливается сразу после установки Windows или другой ОС как служебная программа. Возможно ее установил человек, который ставил вам Windows, или она была предустановлена на вашем ПК или ноутбуке. Или некоторое приложение, требующее Java, установило ее на ПК. Просто знайте, это вовсе не вредоносное приложение, и удалять его во время чистки компьютера не нужно. Не зря мы включили Java в список нужных программ для Windows.

Время от времени вы можете видеть уведомления с предложением обновить Java. С каждым таким обновлением платформа Java улучшается, устраняются уязвимости и исправляются ошибки. Рекомендую соглашаться и обновлять ее. Это касается и другого ПО – периодически обновляйте антивирусы, программы, которыми пользуетесь, и операционную систему. Теперь вы знаете, зачем нужна Java на ПК, и что она делает.

Время на прочтение
15 мин

Количество просмотров 23K

Привет! Я Виктор Барсуков, Java-разработчик в Lamoda. В этой статье я хочу рассказать о разработке десктопного Java-приложения, что из этого получилось и что можно было бы сделать иначе.

В 2019 году в России ввели обязательную маркировку ряда товаров. В связи с этим малому бизнесу пришлось покупать и настраивать дорогие по меркам МСП (то есть, малых и средних предпринимателей) программы и оборудование. 

У меня есть такие знакомые, и из общения с ними я знаю, что в России малому бизнесу и без маркировки хватает забот. Поэтому решил внести посильный вклад в развитие МСП. Но какой вклад может сделать программист? Написать программу. Программу с одной-единственной функцией — печатью кодов маркировки, которая должна помочь соблюсти требования новых законов и избежать непомерных штрафов.

Предыстория проекта

С 2019 года в РФ введена обязательная маркировка ряда товаров. Более подробно об этом можно узнать на сайте Честного Знака. На момент старта маркировки было много нерешенных вопросов, которые озвучивались в профильных чатах. Малым предприятиям требовалось приобретать и настраивать достаточно дорогие программные решения. В результате многие покупали 1С со всем его богатым набором функций исключительно ради печати DataMatrix-кодов.

Мне показалось, что ситуацию вполне можно исправить, написав программу с единственной функцией — печать кодов маркировки. Собственно, с этого все и началось.

Дисклеймер: сразу оговорюсь, что проект делается в свободное от основной работы время, поэтому глубоко исследовать разные технологии было некогда. Часто приходилось выбирать не самое оптимальное решение, а первое, которое показалось приемлемым, и с хорошо описанной документацией.

Используемые технологии

Так как я Java-разработчик, то неудивительно, что в первую очередь рассматривался знакомый язык. Конечно, Java чаще всего ассоциируется с разработкой бэкенда, но я решил попробовать его для десктопа.

При разработке десктопного приложения на Java выбор в принципе стоит между JavaFx и Swing. JavaFx показался дружелюбным в разработке, поэтому выбор пал на него. Swing все-таки считается устаревшей технологией и даже Oracle говорит о замене Swing на JavaFx.

Изначально проект был на Java 8, потому что у него еще есть поддержка JavaFx. В более старших версиях эту функцию убрали, поэтому потребуются определенные танцы с бубном для запуска приложения. Ниже опишу, как удалось обойтись без них и продолжить поддерживать актуальный стек. 

Сборка дистрибутива

Первые версии приложения поставлялись как fat-jar со всеми зависимостями, но это оказалось неудобно. Целевая аудитория — малые предприниматели, у которых уровень владения компьютером чаще всего на уровне пользователя, изредка — продвинутого пользователя. Для них оказалось весьма проблематично устанавливать Java правильной версии, а потом запускать приложение через bat-файл. 

Сначала я рекомендовал сборку Java от Liberica: после инсталляции она связывает зависимости, и приложение запускается просто по двойному клику мыши. Но даже после этого при вводе запроса «barCodesFX» Google продолжал автоматом подсказывать «как запустить». К счастью, сейчас ситуация поменялась.

Эта подсказка натолкнула меня на мысль, что приложение должно запускаться через exe-файл по двойному клику без установки дополнительного ПО. Или же это ПО должно ставиться автоматом.

В поисках решения нашелся проект Launch4j. Он позволяет создавать exe-файл, выступающий в роли «стартера» для основного jar-приложения. При этом JRE «правильной» версии помещается в состав дистрибутива и не требует отдельной установки. Это увеличило размер дистрибутива, но в век безлимитного интернета лишние 70 Мб для удобства пользователя не кажутся критичными.

Отдельная благодарность команде Liberica, которая поставляет сборки JRE с подключенными модулями JavaFx — это сильно облегчает запуск приложения.

Сам exe-файл создается при сборке после добавления плагина в maven-проект.

<plugin>
   <groupId>com.akathist.maven.plugins.launch4j</groupId>
   <artifactId>launch4j-maven-plugin</artifactId>
   <version>2.1.2</version>
   <executions>
       <execution>
           <id>l4j-clui</id>
           <phase>compile</phase>
           <goals><goal>launch4j</goal></goals>
           <configuration>
               <headerType>gui</headerType>
               <outfile>target/BarCodesFX.exe</outfile>
               <jar>barCodesFX.jar</jar>
               <icon>src/main/resources/microQR.ico</icon>
               <downloadUrl>https://download.oracle.com/java/17/archive/jdk-17.0.1_windows-x64_bin.msi</downloadUrl>
               <errTitle>Launching error</errTitle>
               <dontWrapJar>true</dontWrapJar>
               <jre>
                   <path>%PWD%/jre-17.0.1</path>
                   <jdkPreference>preferJdk</jdkPreference>
                   <initialHeapPercent>20</initialHeapPercent>
                   <maxHeapPercent>80</maxHeapPercent>
               </jre>
               <versionInfo>
                   <fileVersion>0.0.0.0</fileVersion>
                   <txtFileVersion>${version}</txtFileVersion>
                   <fileDescription>BarCodesFX-${version}</fileDescription>
                   <copyright>Barsukov Viktor</copyright>
                   <productVersion>0.0.0.0</productVersion>
                   <txtProductVersion>${version}</txtProductVersion>
                   <productName>BarCodesFX</productName>
                   <internalName>BarCodesFX</internalName>
                   <originalFilename>BarCodesFX.exe</originalFilename>
               </versionInfo>
               <messages>
                   <startupErr>Startup error</startupErr>
                   <bundledJreErr>Bundled Jre Error</bundledJreErr>
                   <jreVersionErr>Jre Version Error</jreVersionErr>
                   <launcherErr>Launcher Error</launcherErr>
               </messages>
           </configuration>
       </execution>
   </executions>
</plugin>

Через несколько недель после компоновки дистрибутива был обнаружен задокументированный баг: если в пути к exe-файлу есть названия папок на национальных языках (то есть на любом, кроме английского), то приложение не запускается. К счастью, проект Launch4j в целом живой и этот баг пофиксили.

Далее zip-архив вручную упаковывается в SFX-архив и выкладывается в SourceForge. Теперь пользователь может спокойно скачать единственный установочный exe-файл, несколько раз нажать ОК и Далее и получить работающую программу. 

Функциональность расширяется: подключаю Spring и СУБД

Как скрестить ужа с ежом?

Как скрестить ужа с ежом?

Проект развивался по классическому Agile: вначале скейт, потом самокат, потом велосипед. На старте основная функциональность заключалась в печати датаматриксов. Потом добавилось генерирование XML-файлов, а в самой программе появились настройки. 

Изначально настройки хранились в файле и подтягивались с запуском приложения, однако для пользователей это было неудобно и неочевидно. Затем все переехало в графический интерфейс, но тут начались проблемы с общим доступом к файлу настроек и стало понятно, что не хватает базы данных. Для создания БД мне захотелось использовать знакомый фреймворк, а не писать все с нуля, поэтому я подключил к проекту Spring.

К счастью, есть проект JavaFX Weaver, который решает проблемы получения колючей проволоки путем скрещивания ежа и ужа: контроллеры превращаются в бины, dependency injection становятся доступными и становятся доступными прочие плюшки Spring. Но главное — не требуется полностью переписывать все приложение.

В качестве базы данных была выбрана H2. Она легковесная и не требует установки. Пользователь просто запускает приложение и все работает без предварительной установки СУБД.

Добавление шаблонизатора

Проект изначально был опенсорсный, поэтому довольно быстро набрал популярность. Но конкуренты не дремлют: для увеличения трафика коммерческие компании создавали свои бесплатные решения. И у этих решений было одно ключевое преимущество —  возможность создавать в удобном графическом редакторе свой шаблон этикетки.

Для меня разработка такой функциональности была непозволительной роскошью, потому что заняла бы много времени без гарантии положительного результата. Однако мне все же хотелось добавить шаблонизатор. По умолчанию в моем приложении было только два варианта печати: либо А4, либо термопринтер. На самой этикетке выводился только датаматрикс и чуть-чуть пользовательского текста.

Первый вариант наклеек для листа А4, а второй — для термопринтера

Первый вариант наклеек для листа А4, а второй — для термопринтера

В поисках решения я подробно изучил продукты компании iText. Их библиотека iТext PDF используется в BarCodesFX для генерации PDF. У нее есть много разных функций и при этом она полностью бесплатная при использовании в опенсорс-проектах. В коде можно полностью собрать pdf-файл с форматированием, дополнительными элементами и картинками. Через нее же происходит преобразование строки в датаматрикс.

У них же обнаружил pdfHTML — библиотеку, которая преобразует HTML-страницу в PDF. Внутри нее нашлась функциональность для заполнения HTML-шаблона. Так у пользователя появилась возможность самостоятельно сверстать практически любую этикетку, а не ограничиваться предустановленными шаблонами.

В шаблоне часть тегов нужно было заменять на пользовательские значения. Например, вместо <datamatrix/> выводить картинку кода, а вместо <page_number/> — номер страницы. Для этого разработчику достаточно в свойствах передать свою CustomTagWorkerFactory, которая наследует от DefaultTagWorkerFactory. Таким образом, все изменения гармонично встраиваются в поток обработки HTML-кода, при необходимости заменяя дефолтные обработчики тегов на собственные, с помощью имплементации интерфейса ITagWorker . 

properties.setTagWorkerFactory(new CustomTagWorkerFactory());
List<IElement> elements =
   HtmlConverter.convertToElements(new FileInputStream(htmlSource), properties);

for (IElement element : elements) {
   document.add((IBlockElement) element);
}

Можно сказать, что в целом шаблонизатор удался и им активно пользуются. Из 194 млн распечатанных кодов 25 млн было сгенерированно с использованием шаблонизатора. В качестве источника данных для заполнения полей типа артикула, цвета и размера используется эксель-файл.

Итоговая кастомизированная наклейка

Итоговая кастомизированная наклейка

Хотя не обошлось и без нюансов при верстке. Например, если ваш кастомный тег <datamatrix/> обернуть в <div>, то замена не произойдет. Такая вот особенность библиотеки.

Попытки интеграций с API

За время существования проекта было две попытки интеграций с API операторов маркировки.

Первая интеграция была с СУЗ (станцией управления заказами) оператора ЦРПТ (Центра развития перспективных технологий). Она прошла успешно, все работало, но в какой-то момент оператор без предупреждения изменил поведение API. Это привело к массовым обращениям от пользователей, которые сообщали об ошибках в работе приложения.

Так как я занимаюсь проектом в свободное время, то не могу быстро реагировать на такие изменения и обеспечить требуемый уровень поддержки. Поэтому от интеграции с API пришлось отказаться. Кроме того, добавилась необходимость использовать КриптоПро для авторизации, так что эта задача задвинулась в дальний угол. 

Вообще работа с криптографией — это весьма интересная задача. Но использовать отечественного криптопровайдера типа КриптоПро в десктопном Java-приложении — это задача «со звездочкой».

Вторая попытка интеграции была с API оператора Республики Беларусь. Авторизация у оператора проходила по логину и паролю и не требовала наличия крипто-провайдера. Функциональность была готова к релизу, но в последний момент пришлось отказаться.

  • Во-первых, была плохая коммуникация с поддержкой оператора РБ, нежелание разбираться и что-то решать. Их позиция: «У нас все работает, проблема на вашей стороне».

  • Во-вторых, нарушение стандарта RFC 8259 при реализации API. В чате поддержка оператора сказала, что символы GS не нужно экранировать при использовании их API. Это дважды нарушает 7-ой пункт стандарта.

Вместе два этих фактора давали гремучую смесь. Пользователи пытались бы использовать внедренную функциональность, а она не работает должным образом. Обращения шли бы ко мне, отнимая много времени на разбор ошибок. Только после подробного разбора стоило идти к оператору. При этом высока вероятность, что оператор просто «отфутболит» мой запрос, потому что я даже не являюсь резидентом. А с точки зрения пользователя — проблема в программе.

Генерация XML

Чтобы при работе на сайте не отмечать каждый код в длинном списке, Честный Знак добавил возможность загружать коды файлами. Например, вам нужно списать 2000 кодов и вы просто загружаете один файл, а не выискиваете все эти коды и не прокликиваете их по одному. 

Однако файл должен быть в xml-формате с правильно заполненными тегами. Вручную его создавать еще сложнее, чем прокликивать коды по одному. И именно с созданием таких файлов и помогает программа.

Задача создания xml-файлов достаточно типовая, поэтому здесь особо нечего рассказывать, кроме трех интересных моментов:

Для генерации XML используется библиотека Jackson FasterXML. При сериализации списков пришлось добавить кастомный StdSerializer, иначе вместо этого…

<products_list>
    <product>
      <ki>0104600840362250215&lt;QCkpilDMTLs</ki>
    </product>
    <product>
      <ki>0104600840362250215*uJEIn4EH&gt;Rd</ki>
    </product>
</products_list>

… получали лишние теги product вокруг списка.

<products_list>
<product>
    <product>
        <ki>0104600840362250215&lt;QCkpilDMTLs</ki>
    </product>
    <product>
        <ki>0104600840362250215*uJEIn4EH&gt;Rd</ki>
    </product>
</product>
</products_list>

Разрулить ситуацию через аннотации не представлялось возможным, потому что классы генерируются автоматически на базе XSD-схем. 

ЦРПТ ввели дополнительные правила экранирования символов в кодах маркировки в XML. По этой причине нужно было экранировать одинарные и двойные кавычки, хотя этого не требуется по стандарту (пункт 2.4). 

К счастью, в библиотеке FasterXML это удалось решить добавлением кастомной EscapingWriterFactory.

public Writer createEscapingWriterFor(final Writer out, String enc) {

   return new Writer(){
       @Override
       public void write(char[] cbuf, int off, int len) throws IOException {

           String val = "";
           for (int i = off; i < len; i++) {
               val += cbuf[i];
           }
           String escapedStr =  StringEscapeUtils.escapeXml(val);
           out.write(escapedStr);
       }

       @Override
       public void flush() throws IOException {
           out.flush();
       }

       @Override
       public void close() throws IOException {
           out.close();
       }
   };
}

ЦРПТ предоставляет некорректные xsd-схемы. Схемы разделены по документам: есть документ на ввод в оборот, вывод из оборота, списание. Для каждого документа есть свой xsd-файл и при этом есть общая для всех схема — «Определенные пользовательские типы». 

Общая схема добавляется через импорт в схемы документов. Например, в схеме документа списания есть такой элемент:

 <xs:element name="cis" type="cis_type">
   <xs:annotation>
     <xs:documentation>Код идентификации</xs:documentation>
   </xs:annotation>

Однако тип cis_type не отражен в общей схеме «Определенные пользовательские типы». Такие типы приходилось допридумывать самостоятельно, потому что даже техподдержка не смогла предоставить полностью валидные схемы.

Тесты

Боль. Их просто нет. А для уважающего себя проекта они должны быть написаны — хотя бы юнит-тесты. Но на все не хватает времени.

И к сожалению, нет ни малейшего представления, как можно тестировать сам интерфейс. Вся надежда на проект TestFX, но пока у меня еще не дошли руки посмотреть его подробнее.

Что стоило бы изначально сделать иначе

Контроллер. Сейчас при запуске приложения открывается форма со множеством вкладок, которые программно управляются из одного класса-контроллера. Из-за этого класс достигает размера под 1000 строк. Можно было бы подключать каждую вкладку как отдельный FXML-файл со своим контроллером — это сделало бы программу намного удобней в разработке и поддержке.

Подключить DI (dependency injection) на более ранних этапах. Это повлияло бы в целом на архитектуру и упростило как разработку, так и дальнейшую поддержку. До сих пор в коде видны следы разработки до DI с ручным управлением жизненным циклом объекта. Изначально при написании пришлось потратить время на кодирование жизненного цикла и при дальнейшей разработке приходится помнить об этой особенности.

Немного статистики

Поделюсь статистикой скачиваний за все время существования проекта. Пик в 7000 скачиваний — это выброс из-за сбоя в SourceForge, когда вместо загрузки файла заново запускался таймер, и так до бесконечности. При этом прокручивался счётчик скачиваний. Остальные пики совпадают с этапами внедрения маркировки.

Пик скачивания из РБ (Республика Беларусь) в последние месяцы обусловлен тем, что программа была официально рекомендована оператором РБ для формирования pdf файлов с этикетками.

Согласно статистике самой программы за все время существования проекта с ее помощью распечатали приблизительно 184 000 000 этикеток и ввели в оборот около 210 000 000 единиц товара, а отгрузили почти 81 000 000 единиц товаров.

Статистика собирается обезличенно, о чем указано в описании к программе. При желании сбор статистики можно отключить. Дружественная компания предоставила серверные мощности для сбора данных.

Цифры приблизительные, потому что статистику начали собирать уже после старта обязательной маркировки обуви. Кроме того, сгенерировать PDF — не значит его распечатать. К тому же у ряда пользователей программа находится за корпоративным фаерволом, поэтому статистика просто не доходит до сервера.

Выводы

Разрабатывать десктопные приложения на JavaFx можно: технология живая и достаточно удобная за счет разделения view и controller. В графическом редакторе можно набросать FXML-форму, потом прописать ей поведение в контроллере. Есть подключаемые библиотеки с дополнительными элементами форм. А еще можно написать свои элементы при необходимости. Есть возможность задействовать сторонние фреймворки типа Spring — он работает с современными версиями Java.

Подводя итог можно сказать следующее: если вы Java-разработчик и перед вами поставлена задача сделать утилитное десктопное приложение для внутреннего использования, то JavaFx — хороший выбор. Для написания небольших прикладных программ его более, чем достаточно.

Если же вам нужно сделать коммерческое решение с красивой визуальной картинкой, использующее особенности конкретной ОС (например, сворачивание в трей или показ всплывающих уведомлений), то скорее всего вам потребуется другое решение.

Спасибо, что дочитали, буду рад ответить на вопросы в комментариях.

Ссылка на проект, ссылка на исходники

java что этоМногие пользователи сталкиваются на своих компьютерах с программой Java и возникает вполне закономерный вопрос — что это за программа и для чего она нужна?

Java — это технология, которую используют для разработки онлайн-приложений, то есть программ, запускающихся и работающих прямо в вашем браузере.

Подобные приложения существенно расширяют возможности интернета и с помощью технологии Java мы можем играть в онлайн-игры, общаться в различных онлайн-чатах, загружать фото и видео на различные сайты и многое-многое другое.

Но для того, чтобы воспользоваться всеми этими преимуществами необходимо, чтобы на вашем компьютере была установлена среда Java. То есть это специальная программа, позволяющая запускать Java-контент прямо в вашем браузере. Если среда не установлена на вашем компьютере, то многие онлайн-приложения и веб-сайты просто не будут работать. Обычно в этом случае когда вы заходите на веб-страницу, содержащую Java-контент, появляется сообщение о необходимости скачать и установить на ваш компьютер Java. Многие это делают даже не задумываясь, а потом возникают вопросы вроде: «что это за программа?», «как она попала на мой компьютер?» и «для чего она нужна?»

Также после установки на компьютер, Java будет отслеживать появление новых обновлений на официальном сайте и как только таковые появятся, вы получите сообщение с предложением их установить.

Так как Java-приложения весьма популярны и применяются в интернете повсеместно, то их могут использовать злоумышленники в своих целях. Это означает, что стоит всегда обновлять Java на своем компьютере, так как в обновлениях устраняются обнаруженные уязвимости и повышается безопасность и стабильность работы.

Более подробную информацию о технологии Java, а также ответы на наиболее частые вопросы, касающиеся Java, вы можете получить на официальном сайте — http://www.java.com

Также с официального сайта вы можете скачать последнюю версию Java.

Java что это за программа и нужна ли она?

Откуда на компьютере появляется программа Java и для чего она нужна?

Говоря простым языком, Java это платформа для разработки и работы программ, игр и иных приложений, написанных с ее использованием. Более подробно о ней, а также о ее появлении на вашем компьютере мы поговорим в данной статье.

Описание программы

Первая версия программы Java была создана северно-американским разработчиком Sun Microsystems в конце предыдущего столетия. Изначально она именовалась как “Oak”, то есть “дуб” и предназначалась для программирования электронного оборудования в быту.

Программисты и продвинутые пользователи ПК использовали Java на устройствах, чтобы писать коды для так называемых «апплетов». Так в профессиональной среде именуют приложения, работа которых возможна через браузер. Например:

  • Календарь;
  • Виджет часов;
  • Гостевая книга
  • Интернет-сообщество, которое позволяет общаться в режиме реального времени.

Но Java необходима на компьютере не только для написания программ. Она нужна также и для их работы. Сейчас многие приложения, игры и интернет сайты используют ресурсы Java. Это значит, что для их работы требуется наличие актуальной версии данной программы.

Например, популярный Minecraft не начнет работать, если не установлена Java. Не запустится и такая система программирования как IDE. Она включает текстовый редактор, отладчик и другие функции, которые полезны для создания новых приложений на компьютер.

Почему на компьютере уже установлена программа Java?

Во многие операционные системы, в их число входит и Windows (начиная с версии Windows 98), уже  интегрирована программа Java, и появляется она сразу после установки. Также возможны ситуации, при которых во время установки той или иной игры Java будет установлена вместе с ней автоматически. Именно по этому удалять Java категорически запрещено. Это может привести к отказу в работе многих других приложений, установленных на вашем ПК.

Иногда пользователь будет получать уведомления о том, что появилась обновленная версия программы Java. Эти обновления нужно устанавливать обязательно ,чтобы не получить проблем с запуском других приложений в будущем.

что такое java На компьютере

Сообщение в системном трее про наличие обновления Java

  • Java virtual machine launcher error unable to access jarfile c windows syswow64
  • Java не является приложением win32 windows xp
  • Java virtual machine launcher a java exception has occurred windows 10
  • Java запуск из командной строки windows
  • Java virtual machine for windows