Categories
Apps

Starting JAX-RS and REST Web Services Using Apache Wink: Part One

This article explains the basic concepts of Jakarta RESTful web services (specifically, JAX-RS, formerly the Java API for RESTful web services). Inside, we detail the step-by-step implementation of web services using Apache Wink.

Before we begin, let’s revisit some of the essential terms you should know to better understand web services, REST, and related concepts.

Extensible Markup Language (XML): XML is a A standard for document markup that uses generic syntax to mark-up data or information with easy to digest, human-readable tags. The XML standard is endorsed by the World Wide Web Consortium (W3C).

JavaScript Object Notation (JSON): JSON is a data-interchange format, lightweight in nature, based upon JavaScript. JSON is programming-language neutral. However it does use conventions from developer languages including C, C++, C#, Java, JavaScript, Perl, and Python.

JSON Schema: This is a JavaScript object notation document describing the structure of JSON and that also constrains the information inside of other JSON documents.

RESTful: Refers to software and services that adhere to Representational State Transfer (REST) constraints.

XML: Extensible Markup Language.

XML Namespace: A collection of names that are identified by a Uri reference. They are used in XML documents for element types and attribute names.

XML Schema: An XML document that describes the structure and constrains the contents of other XML documents.

XML Schema Definition Language: An XML syntax for writing XML schemas, recommended by the World Wide Web Consortium (W3C).

HATEOAS: From Wikipedia: “Hypermedia as the Engine Of Application State (HATEOAS) is a constraint of the Rest Application Architecture that distinguishes it from other network application architectures. With HATEOAS, a client interacts with a network application whose application servers provide information dynamically through hypermedia. A Rest client needs little to no prior knowledge about how to interact with an application or server beyond a generic understanding of hypermedia.

Introduction to JAX-RS and REST

This product web service was built using Apache Wink. It can add, update, delete and retrieve products in Memory. REST stands for Representational State Transfer and is based on the concepts of Roy Fielding’s dissertation work as part of his thesis. It works on HTTP and has the following differences when compared to SOAP:

It works using the HTTP protocol, as opposed to SOAP, which uses its own protocol.
It is capable of using HTTP GET, PUT, POST, and DELETE. SOAP only uses POST.
It relies on the HTTP infrastructure. SOAP is transport neutral.
Producers and consumers are aware of content exchange.
At this time, many non-functional requirements or any WS-* standards are not supported.

Installations Required for JAX-RS and REST

Eclipse 4.2.0.
Apache Wink 1.4.0.
Apache Tomcat 8.0.9.
JDK 1.7.0/JRE 1.7.0.

Creating a Server/Web Service

The following are the steps needed to build the web service using Apache Wink:

Step One: Create a Dynamic Web Project in Eclipse.

Step Two: Build a Core Application that performs CRUD Operations.

/**
*
*/
package me.sumithpuri.rest.persistence;
import java.util.ArrayList;
import java.util.List;
import me.sumithpuri.rest.vo.Product;
/**
* @author sumith_puri
*
*/
public class ProductPersistenceManager {
private List productDatabase = new ArrayList();
private static ProductPersistenceManager persistenceManager;
private static int id=0;
private ProductPersistenceManager() {
}
public void add(Product product) {
System.out.println(“database: added one product”);
// atomic id creation
id++;
product.setId(id);
productDatabase.add(product);
}
public List get() {
System.out.println(“database: retrieved all products”);
return productDatabase;
}
public void update(long productId, String productName) {
System.out.println(“database: modified one product”);
for(int i=0;i<productDatabase.size();i++) {
Product product = productDatabase.get(i);
if(product.getId()==productId) {
product.setName(productName);
productDatabase.remove(i);
productDatabase.add(i,product);
}
}
return;
}
public void delete(long productId) {
System.out.println(“database: deleted one product”);
for(int i=0;i<productDatabase.size();i++) {
Product product = productDatabase.get(i);
if(product.getId()==productId) productDatabase.remove(i);
}
return;
}
public static ProductPersistenceManager getInstance() {
if(persistenceManager==null) {
synchronized(ProductPersistenceManager.class) {
if(persistenceManager==null) {
persistenceManager = new ProductPersistenceManager();
}
}
}
return persistenceManager;
}
}

Step Three: Add the Supporting JAR Files in the Build Path.

Apache Wink Rest Web Services

Step Four: Create the REST Web Service using Apache Wink (GET, POST, DELETE, PUT).

package me.sumithpuri.rest.webservice;

import java.util.List;
import javax.ws.rs.DELETE;
import javax.ws.rs.GET;
import javax.ws.rs.POST;
import javax.ws.rs.PUT;
import javax.ws.rs.Path;
import javax.ws.rs.PathParam;
import javax.ws.rs.Produces;
import javax.ws.rs.core.MediaType;
import me.sumithpuri.rest.persistence.ProductPersistenceManager;
import me.sumithpuri.rest.vo.Product;

/**
* @author sumith_puri
*
*/
@Path(“product”)
public class ProductWebService {
ProductPersistenceManager persistenceManager = ProductPersistenceManager.getInstance();
@GET
@Produces(MediaType.TEXT_PLAIN)
public String getProducts() {
List products = persistenceManager.get();
String productList = new String();
for(Product producti: products) {
productList+=producti.toString() + “\n”;
}
// return as plain text – other types include xml, json
return productList;
}

@POST
public String addProducts(String productStr) {
Product product = new Product();
product.setName(productStr);
persistenceManager.add(product);
return productStr;
}

@DELETE
@Path(“/{id}”)
public void deleteProduct(@PathParam(value=”id”) long id) {
persistenceManager.delete(id);
return;
}

@PUT
@Path(“/{id}”)
public void modifyProduct(@PathParam(value=”id”) long id, String productName) {
persistenceManager.update(id, productName);
return;
}
}

Step Five Configure the Application for Apache Wink.

To allow Apache Wink to locate this service as a REST web service, you can either define an additional class or configure an application file. We are using an application file to mention all our web services.

You can place this under WEB-INF/and name the file simply ‘application’ (without any extension).

me.sumithpuri.rest.webservice.ProductWebService

Next, you need to specify the servlet-related configuration for allowing Apache Wink REST Servlet to locate this application configuration. You do that by specifying the location of ‘application’ as the parameter ‘applicationConfigLocation’ in WEB-INF/web.xml

products

restService
org.apache.wink.server.internal.servlet.RestServlet

applicationConfigLocation
/WEB-INF/application

restService
/rest/*

Step Six: Deploy as an Apache Tomcat Web App, directly:

REST Web Services Apache Wink

Create a Client/Web Service Client

The steps to test the web service or write a REST client are as follows:

Step One: Create a Java project in Eclipse.

Step Two: Include the Support Client JAR files in the Classpath.

Create-Java-Project-Eclipse

Step Three: Build the Client to Test or Access the GET method.

Step Four: Build the Client to Test or Access the POST method.

Step Five:. Build the Client to Test or Access the DELETE method.

Step Six: Build the Client to Test or Access the PUT method.

package me.sumithpuri.rest.client;

import javax.ws.rs.core.MediaType;

import org.apache.wink.client.ClientConfig;
import org.apache.wink.client.Resource;
import org.apache.wink.client.RestClient;

/**
* @author sumith_puri
*
*/
class ProductRESTClient {

static String REST_WEB_SERVICE=”http://localhost:8080/products/rest/product”;
static ClientConfig clientConfig = new ClientConfig();

/**
* @param args
*/
public static void main(String[] args) throws Exception {

try {

ProductRESTClient restClient = new ProductRESTClient();
System.out.println(“Apache Wink Based REST Client”);
System.out.println(“Sumith Kumar Puri (c) 2015”);
System.out.println(“=============================”);

restClient.configureClient();
System.out.println();

restClient.invokeGET();
System.out.println();

String product=”Sumith Puri” + (int) (Math.random()*9999);
restClient.invokePOST(product);

System.out.println();
product=”Sumith Puri” + (int) (Math.random()*9999);
restClient.invokePOST(product);

System.out.println();
product=”Sumith Puri” + (int) (Math.random()*9999);
restClient.invokePOST(product);

System.out.println();
product=”Sumith Puri” + (int) (Math.random()*9999);
restClient.invokePOST(product);

System.out.println();
restClient.invokeGET();

System.out.println();
restClient.invokeDELETE(2L);

System.out.println();
restClient.invokeGET();

System.out.println();
product=”Sumith Puri” + (int) (Math.random()*9999);
restClient.invokePOST(product);

System.out.println();
product=”Sumith Puri” + (int) (Math.random()*9999);
restClient.invokePOST(product);

System.out.println();
restClient.invokeDELETE(4L);

System.out.println();
restClient.invokeGET();

System.out.println();
restClient.invokePUT(3L,”Sumith Puri”);

System.out.println();
restClient.invokeGET();
} catch (Exception e) {

e.printStackTrace();
}
}

public void configureClient() {

}

public void invokeGET() {

System.out.println(“Testing GET command….”);
RestClient restClient = new RestClient(clientConfig);
Resource resource = restClient.resource(REST_WEB_SERVICE);
String response = resource.accept(“text/plain”).get(String.class);
System.out.printf(response);
System.out.println(“…GET command is successful”);
}

public void invokePOST(String product) {

System.out.println(“Testing POST command…”);
RestClient restClient = new RestClient(clientConfig);
Resource resource = restClient.resource(REST_WEB_SERVICE);
resource.contentType(MediaType.TEXT_PLAIN).accept(MediaType.TEXT_PLAIN).post(String.class,product);
System.out.println(“…POST command is successful”);
}

public void invokePUT(Long id, String productName) {

System.out.println(“Testing PUT command…”);
RestClient restClient = new RestClient(clientConfig);
Resource resource = restClient.resource(REST_WEB_SERVICE+”/”+id);
resource.contentType(MediaType.TEXT_PLAIN).accept(MediaType.TEXT_PLAIN).put(String.class, productName);
System.out.println(“…PUT command is successful”);
}

public void invokeDELETE(Long id) {

System.out.println(“Testing DELETE command…”);
RestClient restClient = new RestClient(clientConfig);
Resource resource = restClient.resource(REST_WEB_SERVICE+”/”+id);
resource.contentType(MediaType.TEXT_PLAIN).accept(MediaType.TEXT_PLAIN).delete();
System.out.println(“…DELETE command is successful”);
}
}

The following is the output from the first run of the client:

JAX-RS and REST Web Services

Conclusion

In this blog, you have seen how to build REST web services using Apache Wink for basic data types. Next, I will write about how to include Jackson or Jettison as the stream reader or stream writer JSON libraries so that we can read and write complex or application object types. Stay tuned!

Sumith Puri is a Principal Java/Java EE Architect, a Hard-Core Java // Jakarta EE Developer with 16 (and counting) years of experience. He’s a Senior Member of ACM and IEEE, DZone Core, Member, CSI*; DZone MVB, and Java Code Geek. He holds a Bachelor of Engineering (Information Science & Engineering) from Sri Revana Siddeshwara Institute of Technology, completed the Executive Program in Data Mining & Analytics at the Indian Institute of Technology, and the Executive Certificate Program in Entrepreneurship at the Indian Institute of Management. His experience includes SCJP 1.4, SCJP 5.0, SCBCD 1.3, SCBCD 5.0, BB Spring 2.x*, BB Hibernate 3.x*, BB Java EE 6.x*, Quest C, Quest C++ and Quest Data Structures.

The post Starting JAX-RS and REST Web Services Using Apache Wink: Part One appeared first on Developer.com.

Read more: developer.com

Categories
Apps

OutSystems Connects Low-Code Platform to AWS Services

OutSystems today added a set of components and resources to its portfolio to make it easier to invoke and configure cloud services by Amazon Web Services (AWS).

The Cloud Accelerators for AWS promise to reduce the time and effort developers that employ the company’s namesake low-code platform need to spend on configuring cloud services such as identity verification workflows that compares a photo or selfie with a document such as a driver’s license using the Amazon Rekognition and Amazon Simple Storage Service (Amazon S3) services.

Outsystems Low Code PlatformOutsystems Low-Code Platform

 

Other Cloud Accelerators for AWS address Video Call Validation using Amazon Kinesis or Chime services; self-service chatbots infused with artificial intelligence (AI) enabled by Amazon Lex and Amazon Comprehend services; virtual personal assistants (VPAs) enable by Amazon Alexa; multilingual chatbots enabled by Amazon Translation Services, Amazon Polly, and Amazon Transcribe services; multilingual Video Interaction enabled by Amazon Kinesis, Amazon Translation Services, and Amazon Transcribe services; and a personalized streaming experience enabled by the Amazon DynamoDB and Amazon S3 service.

The Cloud Accelerators are designed for professional developers that are employing the OutSystems low-code platform to accelerate the development of the application, says Barry Goffe, senior director of platform strategy for OutSystems. The platform isn’t aimed at so-called citizen developers but rather professional developers that need a low-code platform for building enterprise-class applications, he said. “We’re focused on professional developers working within an IT organization,” said Goffe.

There are two distinct classes of low-code tools gaining traction within IT environments. The first is aimed at professional developers that are building complex applications as part of a larger team. A second category of low-code tools is aimed more at citizen developers, also known as power users, that are typically employing their domain knowledge to build an application. The challenge those developers often encounter is they are not application designers, so many of those applications don’t tend to be as widely employed. A lack of appreciation for what’s required from an architecture perspective to enable an application to truly scale can also lead to issues.

There are, however, a growing number of citizen developers working with a line of business that, depending on their level of application development expertise, are employing either a low-code tool or, in some instances, a no-code tool based on a visual programming tool to build an application. While those efforts might reduce the application development backlog that continues to grow in the age of digital business transformation, it also increases the potential number of applications that professionals might one day have to rework.

OutSystems is making a case for increasing the productivity of professional developers to reduce the inclination of a citizen developer to build an application that winds up being beyond their capability to construct, secure and maintain.

Of course, all things being equal professional developers have a bias toward procedural code. Any low-code platform they embrace needs to allow them to drop out of the low-code tool to tackle a more challenging requirement whenever they deem it necessary. The challenge now is determining just how much of an application can be built using low-code before having to make that transition.

The post OutSystems Connects Low-Code Platform to AWS Services appeared first on Developer.com.

Read more: developer.com

Categories
Apps

What is Project Management Software for Developers

Project management is a set of philosophies, tools, and techniques employed by a project manager whose primary responsibility is to ensure that projects get completed on time, on or under budget, and to facilitate the needs of the team they are managing.

The duties of a project manager can range greatly but typically involve keeping members of their assigned team on track and helping them address any issues that arise. A project manager might obtain access to tools for the team, conduct check-ins and meetings to make sure everyone is on track with their portion of the project, generate reports for management or stakeholders, and provide resources towards the end goal: project completion.

What is Project Management Software

Project management software is an umbrella term that covers a wide array of software and tools. For our purposes, we will be discussing the tools a software project manager uses or provides for his team, versus a more generalized definition.

Project Management for Developers

Software project management tools can include many different pieces of software features that cover a lot of different areas, depending upon the development project. Some of these include:

Features of Project Management Software for Developers:

Task Management: At their core, task management features for developers are self-explanatory – they allow a programmer or tech member to enter in the tasks they are responsible for, in the midst of handling, any red flags or pain-points, or anything that is holding them up from finishing their tasks. These tasks can then be tracked by the project manager, who can act upon actionable items if need be. For instance, if a programmer is waiting on a designer and that is causing a bottleneck or slowing progress, the project manager could go to the designer and try to resolve the issue before things come to a grinding halt.

File Sharing: File sharing, as you might imagine, is an important feature of project management tools. Developers, software engineers, graphic designers, GUI designers, web developers, and everyone in-between need to be able to share files and access them. Frequently file versioning (keeping copies of files as they change over time), limited access to who can share or view files, and file repository features (such as storage, cloud storage, and so forth) all fall under this feature category.

Schedule Manager: Another common feature of project management software is a schedule management tool that lets you schedule things like routine maintenance, meetings, employee schedules, and a slew of other time-sensitive tasks or routines that need to be followed.

Invoicing, Bookkeeping, Payments:

A project manager will need a place to create vendor invoices, make payments to vendors, keep track of costs and inventories, accounts payable and receivable, and other bookkeeping and invoicing tasks. This is especially true if a project manager uses freelance developer teams, remote software developers, third-party vendors, and so on.

Reporting: Reporting is a pretty broad term when it comes to the roles of a project manager. In general, developer project leads will need to create reports for all manner of projects, utilize real-time analytics, export data, provide business intelligence and insights, create charts and workflows, and conduct trend analysis and trend forecasting. All of this should be achievable in a good piece of software management.

Bug and Error Tracking: Of particular importance to a project manager in the developer field is the ability of your team to track bugs and errors in code. This is crucial to project success, completing projects on time, processing deliverables, and staying within budget.

Other features of project management software for developers can include team collaboration, user interface, calendar and calendar sharing, user permissions and access control, the ability to schedule tasks, time and expense tracking, custom reports, project templates, flowcharting, and the ability to allocate resources.

Benefits of Project Management Software for Developers

Managing a team of developers, programmers, software engineers, and designers can be a difficult task for even the most experienced project manager. That being said, the primary role of project management applications is to make that task as simple as possible. The basis of that starts off with project planning. As they say, if you do not know where you are going, how will you ever get there?

The best project management apps offer the benefit of allowing you to plan your project from start to finish. This includes creating actionable items, planning resource allocation, and so forth. One great benefit of this type of app is that you can automate many tasks. Using the latest in Artificial Intelligence (AI), most modern project management can predict project completion dates, costs, and the like, while also predicting where you might encounter issues in scheduling and hitting key milestones.

Another benefit has to do with resource management. Without resources being managed properly, your project will miss all of its marks. Most developer projects are resource-intensive, and project managers frequently find themselves overwhelmed with resource requests and allocating those needed resources adequately. Having a big picture of all of the moving parts from a resources perspective helps this situation greatly.

Of course, resources aren’t just limited to tools or budgets. Developers and programmers are resources also. Being able to properly manage those resources and monitor workloads to adjust when someone is underperforming or maybe experiencing burnout and needing help are key to your success and the success of your whole software development team.

Probably the second most important benefit of project management software in a developer environment has to do with team collaboration. Developers and software teams can consist of huge numbers of people all working in different departments – sometimes continents apart. Having the ability to cross-reference tasks, discuss timelines, work together on bugs, and see (or report) areas of difficulty or that need help is invaluable. Give your employees a clear idea of goals, tasks, and priorities, so you know the entire project team is on the same page.

Examples of Project Management Software for Developers

We will be following up this article with an in-depth look at some of the best project management software for developers in another article. We will cover well-known tools, such as Jira, Trello, Basecamp, Wrike, and Microsoft Project.

The post What is Project Management Software for Developers appeared first on Developer.com.

Read more: developer.com

Categories
Apps

How to Comment in Python

Commenting is an important and often overlooked aspect of computer programming that many developers tend to overlook early in their careers. Aside from being a part of best practices and standards, commenting code – also known as documenting – has many benefits to even the most veteran of coders. In this article, we look at the importance of documentation and how commenting works in Python.

Importance of Documenting Python Code

Why do we document our code? Isn’t commenting just a waste of time? We hear this from programmers on occasion, who assume that, if you know how to program in Python, you should have no trouble figuring out what the code you are looking at is supposed to do. Sounds simple right? After all, one of the benefits of learning to program in Python is that it is easy to learn and has a high level of readability, thanks in part to its English-like syntax.

However, as any seasoned developer will tell you, it is not always easy to figure out what, exactly, a snippet of code is intended for. For starters, as you develop your software, odds are you will need to revisit old modules and sections to update it as you add new features.

Sometimes the code that needs to be re-written was coded weeks, months, or even years ago. If you documented your code at that time – that is, wrote notes about what the code was intended to do – then you will have a much easier time knowing what you had intended to do and what your mindset was at the time. If not, you will find yourself banging your head trying to figure out your own logic.

As you grow as a programmer and begin to work on larger projects, you will likely be assigned to a team. That team of Python programmers will also need to view your code and work on it. Since every developer approaches coding differently, again, documenting your code becomes even more important.

Once again, these developers on your team – or worse, that take over for you after you leave – will not always be able to stroll over to your desk to ask what your code was meant to do or how it works. You or another developer will often be going over your old code at 3 o’clock in the morning or after a long day of staring at a computer monitor.

The point is this: commenting and documentation make it easier to understand your code and intentions. It makes your life – and every other developer looking at your work – much easier.

Single Line Commenting in Python

Comments are lines of text that Python ignores and does not consider part of a program. In a very real way, comments are invisible to the interpreter – a program that converts a high-level programming language such as Python into machine-readable code.

You can write a single line comment by starting with the hashtag – # – and following it with some text, as shown in the following example:

# This is a comment.

When Python encounters the #, it ignores all of the text that comes after it on that line. Once Python moves on to the next line, it begins reading once more, unless it encounters another hashtag, in which case the rules of commenting apply once more. Observe the following code:

# This is an example of a single-line comment.
# It was written by James Payne

Python will read neither of the lines above. You can create multiple lines of comments by using a # on each concurrent line.

Inline Commenting in Python

Another way to comment in Python is to use inline commenting. This involves placing your comment after code. Here is an example of a program that will “print” text to the user’s window. Note the placement of our comment in this snippet:

print(“Hello Universe”) # This code prints the text “Hello Universe” to the user’s screen.

Anytime Python encounters a hashtag, it will ignore anything after it on that line, even if it shares a line with code.

One note about single line and inline comments: in general, as a best programming practice, PEP8 recommends programmers comment no more than 72 characters on a line. If your comment is longer, it is recommended that you make another single line comment to finish your thought.

Other Uses for Comments in Python

Comments can be used for other purposes than explaining what portions of your code are intended to do. They can also be a tool to layout future coding tasks within the portion of code you are working on. For example, let’s say you want to write several lines of code that print out several people’s names, but you do not know which names you want to print yet. You could use commenting to remind you to add these names later, like so:

# This is an amazing program that will print names
print(“My name is James Payne”)
print(“My father’s name is Ronnie Payne”)

# Add another line to print out my father’s father’s name
# once I figure out what it is

Another way you can use Python comments is to test your code. For example, if you are having trouble finding which line of code is causing an error or not working properly, you can always place a hashtag before a line of code to “comment it out”. This way, the Python interpreter will skip that line of code and move on to the next. This is a great, simple trick you can use if you want to test code or if you decide that portions of your code are no longer needed but do not want to erase those outdated snippets permanently.

Finally, when creating Python comments and documenting your code, try to remember to keep the comments short and precise. Avoid rambling or over-explaining. Try to practice proper grammar and use punctuation as you would if you were writing a real document. Also, avoid typing obvious comments. For example:

print(“Hello”) # A print statement
print(“How are you?”) # Another print comment

Simple statements do not require a comment, and, in fact, commenting frivolously clutters up code and makes your work even sloppier.

The post How to Comment in Python appeared first on Developer.com.

Read more: developer.com

Categories
Apps

Pegasystems Makes Case for Better Looking Low-Code Apps

Pegasystems announced today during an online PegaWorld iNspire event that it will make it easier to create attractive user interfaces for applications built using its low-code tools. 

While both end-users and professional developers may be employing low-code tools to build applications, not all of them are equally adept at designing an application. Pegasystems is looking to address that challenge by automating the development of a UI using a design framework embedded in its platform.  

At the same time, Pegasystems is also enhancing the Pega Digital Experience (DX) application programming interfaces (APIs) to enable them to automatically adjust all connected front-end interfaces when changes are made to its core back-end process without having to rewrite code.

Pegasystems Low Code Tools

The company unfurled an update to its Pega Infinity software suite to enable its low-code tools to invoke a recently launched Pega Process AI platform that makes it simpler to infuse models based on machine learning algorithms within a business process.

Finally, the company also announced that a Pega Process Fabric tool for creating a worklist to unify tasks across multiple applications is now generally available.

A Need To Rapidly Implement Business Process Management Platforms (BPM)

The need to rapidly implement digital business transformation processes drives increased adoption of business process management (BPM) platforms such as the Pega Infinity platform that provide organizations with low-code and no-code tools to rapidly prototype and develop applications using a software-as-service (SaaS) platform, said Pegasystems CEO Alan Trefler. In its most recent quarter, Pegasystems reported that the average contract value (ACM) increased 55% for Pega Cloud to $282 million, which has fueled revenue growth for the longtime provider of BPM tools and platforms.

“BPM is very much switching to the SaaS model,” says Trefler. “We passed $1 billion in revenue in 2020.”

BPM platforms that incorporate low code tools have played a significant role in accelerating custom digital business transformation initiatives in the wake of the economic downturn brought on by the COVID-19 pandemic. A recent global survey of 3,500 decision-makers conducted by the research firm Savanta on behalf of Pegasystems finds 77% of respondents concur that for businesses to be successful, they must engage customers individually based on their behavior and preferences.

Achieving that goal, however, requires custom applications that can process and analyze data in near real-time. As a result, business processes dependent on batch-oriented applications are being modernized using platforms that make low-code tools available to make it easier to construct a custom application.

The degree to which end-users might be constructing those applications is, of course, debatable. Most applications built using low-code tools are still created by professional developers with the expertise needed to ensure an application truly scales. Professional developers use low-code tools as a mechanism to build relatively simple applications faster.

Regardless of who builds them, a low-code application that isn’t especially attractive won’t be employed by end-users. That, of course, is true using any type of application development framework. The only thing that is different in the age of digital business transformation is that the tolerance for ugly applications has never been lower.

The post Pegasystems Makes Case for Better Looking Low-Code Apps appeared first on Developer.com.

Read more: developer.com

Categories
Apps

Java Developer Interview Questions

Java is one of the most used programming languages on the planet, rivaled only by big names such as Python and JavaScript. Java developers are highly sought-after and, as such, the job market can feel a bit competitive. To give yourself a leg-up on the competition, it is always wise to prepare prior to any job interview. To help you achieve that goal, we have compiled a list of the top Java interview questions and answers for 2021.

Preparation is key to any job interview – no matter what industry or title you are applying for. When it comes to jobs for software engineers, developers, and programmers, that preparation is even more vital because going in, you can expect that your skillset and knowledge about coding will be challenged. Sometimes that challenge comes in the form of some simple questions, and other times you will be asked to solve a riddle using programming logic or a bit of Java code.

Researching the company’s history, their product types and services offered, and learning a little about some of their employees through resources like Glassdoor or LinkedIn are also great ways to make sure you are prepared and are able to showcase that you have done your due diligence by asking questions related to the research you have conducted. Employers like to see that you have an interest in their organization and, for your own sake, you should.

At the end of the day, though, refreshing your memory about core Java concepts and programming principles is going to be key to getting you through the door. Without that knowledge – and the ability to prove you have it – you will never land the gig. With that in mind, let’s begin!

Java Job Interview Question Prep

The following are a list of questions (and their relevant answers) you can expect to encounter in an interview for a Java developer position. Not every employer will ask these questions, but they are commonly asked, so it is best to be prepared with their answers just in case.

Question: What is JVM: What Does It Stand For and What Does It Mean?
Answer: JVM stands for Java Virtual Machine and is a necessary piece of software systems use to run Java applications. It consists of several components, including:

Classloader: Loads class files when a Java app is executed.
Class Area: Holds the class level of every class file (including metadata and static variables).
Execution Engine: This is a virtual processor and an interpreter responsible for issuing instruction from the bytecode. It also has a JIT (Just-in-Time) compiler that detects low rates of execution and increases performance.
Java Native Interface: Used to communicate and interact with another piece of software developed in a different programming language, such as C.

Java Interview Questions JVM Concept

By Michelle Ridomi – Own work, CC BY-SA 4.0
Wikimedia Commons

Question: What Memory Allocations are Available in Java?
Answer: The main five types of memory allocation in Java are: Class memory, Heap Memory, Native Method Stack Memory, Program Counter-Memory, and Stack Memory.

Question: What is Object-Oriented Programming?
Answer: Object-oriented programming (OOP) is a programming concept based on the use of Objects, which are essentially containers that hold data as fields and code as procedures. These data fields are also referred to as attributes and properties. Procedures, meanwhile, are frequently referred to as methods.

Classes are another feature of most top-level OOP programming languages. Classes are essentially blueprints that Objects are created from, and, as such, you can define the common properties of all Objects (of one type) that get created from a Class.

Object-oriented programming also incorporates the concepts of inheritance, where one class inherits the properties of another class; encapsulation, a Java mechanism whereby code and data are wrapped up in a single unit; abstraction, the method of obfuscating the detail of implementation from a user, but still providing the functionality; and polymorphism, which describes the multiple forms that a function, Object, or variable might take.

Question: Is Java an Object-Oriented Programming (OOP) Language?
Answer: Yes and no. Java is partially an OOP language. The reason it is not fully has to do with the fact that it uses eight primitive data types: boolean, byte, cha, double, int, float, long, and short. All of these primitive data types are not considered Objects in Java.

Question: What Are Wrapper Classes in Java?
Answer: The easiest explanation for wrapper classes is to say that they are used to make the primitive data types in Java (boolean, byte, cha, double, int, float, long, and short), into Objects.

Question: What is a Java Singleton Class?
Answer: Java Singleton’s are Classes that can only have a single instance or object at a time. You can make a Singleton Class by settings its constructor private.

Question: Can you describe the JIT compiler?
Answer: The JIT compiler – which stands for Just-in-Time compiler – is a program that converts bytecode into a set of instructions and then helps send them to a processor. The purpose of JIT is to enhance performance in Java software at run-time. It earns the moniker “Just in Time” because it gets called upon every time a new method is invoked. Once this happens, JIT compiles the method’s bytecode into machine language “just in time” for it to execute.

Question: What is the difference between an instance variable and a local variable?
Answer: Java local variables are primarily used in a block, constructor, or method. They only have local scope, meaning that they are not used outside of the scope of a block. In fact, local variables are only visible within the block, constructor, or method that they are defined within. They do not have a default value, so you must always declare an initial value when creating them. To define a local variable, you could use the following code:

public class HelloMom
{
public static void main(String[] args)
{
String helloMomMessage;
helloMomMessage = “Hey Mom! Look at me! No hands!”;
System.out.printIn(helloMomMessage);
}
}

Instance Variables, meanwhile, are variables that belong to an object specifically and are declared within a class and outside of a method. If you change this variable type, it will not result in a change in other instances of the class it was created in – only in the original instance. Here is an example of an instance variable in Java:

class Superhero {
public String superName;
private int superAge;
}

In the above example, we created two instance variables. The first – superName – has public access. The second – superAge is an int type with private access.

More Java Programmer Interview Questions

There are literally hundreds of questions a Java programmer may face when being interviewed for a developer job. We have only just scratched the surface here so far. Be sure to bookmark this page, however, as we will be updating our Java Developer Interview Questions primer from time to time.

The post Java Developer Interview Questions appeared first on Developer.com.

Read more: developer.com

Categories
Apps

Bytecode Alliance Lays Foundation for Next Gen of Containerized Software

The Bytecode Alliance is now looking to increase developer enthusiasm for WebAssembly (Wasm) and WebAssembly System Interface (WASI) initiatives that promise to transform how software is constructed following its official incorporation as a non-profit entity.

Originally founded by Fastly, Intel, Mozilla, and Microsoft, the Bytecode Alliance also announced today that Arm, DFINITY Foundation, Embark Studios, Google, Shopify, and University of California at San Diego are all now members of an organization dedicated to promoting Wasm standards that should eventually lead to a different approach to containerizing software that provides the added benefit of being more secure than existing architectures.

Wasm is a portable binary instruction format for building software that describes a memory-safe, sandboxed execution environment. That approach might one day replace the current predominant method for building software that relies on the aggregation of software components that tend to lack distinct security boundaries between them. Today it’s relatively easy for malware to infect all the components of an application.

Extending WebAssembly Beyond Browsers and JavaScript

The World Wide Web Consortium (W3C) drove the development of Wasm as part of an effort to create a common format for browsers executing JavaScript code. There is now an effort to extend Wasm beyond browsers and JavaScript to enable developers to ultimately create a set of universal binaries that could work on any platform without modification. As part of that effort, a Wasmer project to create a server-side Wasm runtime has been launched that provides a way to create portable applications based on a secure container architecture that is more efficient than Docker containers. “There’s a lot of work being done on compiler science, said Fastly CTO Tyler McMullen.

That effort comes at a time when the security of software supply chains is getting a lot more attention these days in the wake of some recent high-profile breaches that resulted in malware being embedded in software that was distributed to a wide range of downstream IT organizations.

Unfortunately, Wasm isn’t all that accessible to the average developer. There’s still a lot of work that needs to be done to make it Wasm accessible to the average developer at a higher level of abstraction. However, as more vendors contribute code and resources to Bytecode Alliance, the pace of Wasm innovation should start to accelerate, noted McMullen.

It may be a while before investments in Wasm fundamentally transform how software is constructed. However, developers might want to start thinking of containers as a continuum. They existed long before Docker containers came into vogue. The contribution Docker provided was creating a way to package images in a container format that could be ported across Linux operating systems. The Windows community has since embraced containers as well. The trouble is containers, as they are constructed today, are not portable between Linux and Windows platforms. Wasm, coupled with advances such as Wasmer, may very well eliminate that limitation in a way that provides the added benefit of enabling software to run a lot more securely than it does today.

The post Bytecode Alliance Lays Foundation for Next Gen of Containerized Software appeared first on Developer.com.

Read more: developer.com

Categories
Apps

Java Multithreading Explained

Multithreading is considered to be one of the more complex topics in computer programming and in Java specifically. To correctly use multithreading in applications requires a high level of skill, knowledge, and experience.

In this article, I introduce multithreading concepts from a developer standpoint and correlate them to Java threading. Developers, software architects and engineers, data scientists, students, and coding professionals – especially the subset using Core Java may use this tutorial to refresh their memory and learn all about the intricacies of multithreading in Java.

Multithreading Concepts in Computer Science

The first thing to understand about multithreading as it relates to Computer Science is what a thread actually is. Threads are a resource-light process that differs from normal processes in a few key ways. The primary features of a thread are:

Threads create a sense of process executions, either concurrently or in parallel.
Threads distribute and execute a single task or similar tasks.
Threads can execute tasks, either on a schedule or asynchronously.
Threads have better context switching mechanisms than processes.
Threads share memory space with other threads and, at the same time, can have their own storage.

Below are some of the core concepts of multithreading from a CS perspective:

Critical Section: This is the section of code that gets accessed by multiple threads at the same time – or concurrently – which can also modify the state. Because of the nature of concurrent modification during the sharing of a resource, access control is necessary.

Semaphores: Semaphores are a resource count; they are used to help control access to a resource that is being shared, particularly in multithreaded environments.

Mutex: Mutex is a construct used for synchronization; it limits one thread to use a given resource at a time. It has ownership associated with it.

Monitor: Another construct use for synchronization. Monitors allow mutual exclusion, as well as the ability to wait for a conditional to be true.

Deadlocks: There are situations where, in the critical section of code, more than one resource is accessed by several threads. In these instances, if a single thread needs access to a resource that is shared, it might need to relieve the currently shared resource. This might also be the case for other threads that are executing concurrently with the same resources. When this mutual exclusion is not possible, it results in a Deadlock.

Deadlock Prevention: The techniques used to prevent deadlock conditions.

Deadlock Handling: The detection of deadlocks and their removal.

Reentrancy: Defines the point where a method – or subroutine – can be entered again without the need to complete its prior invocation.
​​

Java: Multithreading Interfaces and Classes

The following are some core concepts and explanations of multithreading interfaces and classes in Java:

Thread: In Java, the thread class is the most important class related to multithreading. Threads can be implemented by extending this class. Its usage is demonstrated later in this article. In production or in development environments, developers may find it is extremely tough to fix issues related to multithreading. Understanding locks may help solve the most confusing and common errors that even experienced Java programmers have trouble wrapping their heads around.

Runnable: Runnables are an alternative way that you can create a thread. You can either create a thread in Java by implementing a Runnable interface or by extending a thread class. In this case, a developer has to override the run() method from this interface to implement logic. (Note: the Thread Class already implements Runnable). To understand multithreading better, try to remember the lock status on shared objects during each of the methods shown below (where applicable).

start(), Lock Status: It can obtain locks. Call this method when scheduling a thread to run. The thread will run once it is scheduled and a CPU cycle is available.

run(), Lock Status: It can obtain locks; It is called – implicitly – by the Thread runtime in order to start the execution of a thread.

yield(), Lock Status: Locks are held; This particular method either yields or transfers control to a different thread that has an equal priority. The thread it transfers control to – or whether it will eve transfer control – is not guaranteed. The sample code below shows how to create a Thread in Java by extending the thread class.

sleep(), Lock Status: Locks are held; Using this method will cause the current thread being executed to pause its execution for a given amount of time. The amount of time the execution is paused can be specified in milliseconds. An interrupted exception will be thrown, which a programmer will need to address.

join(), Lock Status: Locks are held; Using this will lead to an execution mode, causing all threads to join at the end of the current thread. In this scenario, the current thread continues to completion before it switches to a different thread. This also throws an interrupted exception, which a developer will need to address.

suspend(), Lock Status: Locks are held; This has been deprecated.

resume(), Lock Status: Locks are held; This has been deprecated; Both of these threads have been deprecated as they lead to deadlocks and frozen processes.

stop(), Lock Status: Locks are released; This has been deprecated; This particular thread method has been deprecated because it created irregular states due to damaged objects. It is not recommended for use.

Java Multithreading Tutorial

Java Object Classes and Multithreading

Java’s Object class inherently contains methods used to control access this object, particularly when shared or in multithreaded applications.

wait(), Lock Status: current object lock released, other locks are held; Using the wait() method will cause the current thread to halt execution and go into to a wait state. This will also release the lock it places on the present object, while retaining all other locks on the other objects.

notify(), Lock Status: Lock is acquired by a random waiting thread; The notify() method will notify a thread which is waiting to obtain a lock on the present shared object.

notifyAll(), Lock Status: Lock is acquired by an arbitrary thread that is waiting to obtain a lock on the current shared object. All threads that are waiting to acquire a lock on the thread will be notified using this method.

Java: Understanding Locks in Multithreading

When you think of locks or monitors in Java, the important thing to remember is that concurrent modification performed by threads should never lead to a damaged object. There is one exception to this rule, however: the wait() and notify() parameters that might cause a change to a resource being shared or to an object prior to swapping or switching control. A damaged object is defined as when an undesired or corrupted change in state has occurred.

synchronized: In Java, the synchronized keyword controls access to the critical section of the code. It is also used in the implementation of thread monitors in Java. You can apply the synchronized keyword to static methods and instance level methods, as well as, blocks. Once a thread enters a block or method that is synchronized, it obtains the lock on that object or class. With regards to static synchronized methods, a single lock is held at the class level; it is different than an instance level lock which is held per instance of the class. The synchronized keyword grants mutual exclusion on a shared resource. You may only call wait(), notify(), and notifyAll() in synchronized blocks or methods. Mutexes are not inherently supported in Java.

For an in-depth study on locks, please check out this guide to Java Concurrent Locks.

Asynchronous Task Execution in Java

In the following section, we look at some tools that were introduced in JDK 5 and JDK 6 that provide more controlled access for asynchronous task execution in Java.

Callable: Similar to Runnable, this interface has instances that might b =e executed by another thread.

Executors: Executors are interfaces used for the creation of a thread pool.

ExecutorService: You can use this asynchronous task executor to send Runnable or Callable tasks for execution. You can then track their status through a Future object.
Future: An object return from task submission to an asynchronous task executor from which a task state could be monitored.

AtomicInteger: In Java, this is a type of Integer object that performs concurrent lock-free updates using hardware instructions.

Case Study for Multithreading in Java

In this example code, we will design a multi-threaded system with a shared resource that can take only two values: 0 or 1. It should have two methods – one for incrementing and one for decrementing – that get called by two threads concurrently. One of the threads can only constantly increment, and the other can only constantly decrement. Their operations should be mutually exclusive.

Editor’s Note: You can read more about Multithreading in Java at our multithreading page.

The solution is a simplified version of the “Producer-Consumer Problem”.

package com.developer.skp.java.multithreading;

public class DevDecrementer implements Runnable {
DevSharedObject devSharedObject;

DevDecrementer(DevSharedObject devSharedObject) {
this.devSharedObject=devSharedObject;

public void run() {
while(true) devSharedObject.decrementerAccess();
}
}

package com.developer.skp.java.multithreading;

public class DevIncrementer implements Runnable {

DevSharedObject devSharedObject;

DevIncrementer(DevSharedObject devSharedObject) {
this.devSharedObject=devSharedObject;
}

public void run() {
while(true) devSharedObject.incrementerAccess();
}
}
package com.developer.skp.java.multithreading;

public class DevWorkbench extends Thread {

public static void main(String[] args) {

DevSharedObject devShared=new DevSharedObject();

Thread devThread01=new Thread(new DevIncrementer(devShared));
devThread01.start();

Thread devThread02=new Thread(new DevDecrementer(devShared));
devThread02.start();
}
}
package com.developer.skp.java.multithreading;

public class DevSharedObject {

// access from within this class only
private int x;

public synchronized void decrementerAccess() {
try {
if (x == 1) {
x–;
notify();
} else {
wait();
}
} catch (InterruptedException e) {
System.out.println(“thread interrupted”);
}
}

public synchronized void incrementerAccess() {
try {
if (x == 0) {
x++;
notify();
} else {
wait();
}
} catch (InterruptedException e) {
System.out.println(“thread interrupted”);
}
}
}

Practice Java Coding Riddle for the Reader

Most of the classes below were introduced in JDK 7. They provide an alternate and, in some ways, easier way of programming multithreaded applications in Java.

Condition: Condition is used to factor out Object monitor methods such as wait(), notify(), and notifyAll() into separate, distinct objects in order to give the effect of having multiple wait-sets per object. This is achieved by combining them with the use of arbitrary lock implementations. Whereas a lock replaces the use of synchronized methods and statements, a Condition replaces the use of the Object monitor methods. Condition is a Java interface.

signal(): Wakes up one waiting thread.

signalAll(): Wakes up all waiting threads.

await(): This will cause the current thread to wait until it is either signaled or interrupted. Implementing lock provides more robust locking operations than you can obtain with synchronized methods and statements. Lock is an interface.

ReentrantLock: A re-entrant mutual exclusion lock with the same basic behavior as an implicit monitor lock. It is a concrete implementation of Lock.

Your task: design an asynchronous task executor modeled as a thread pool executor.
Hint for Solution: It is a simplified version of the “Producer-Consumer Problem”.

Happy Multithreading in Java!

Sumith Puri is a Principal Java/Java EE Architect, a Hard-Core Java // Jakarta EE Developer with 16 (and counting) years of experience. He’s a Senior Member of ACM and IEEE, DZone Core, Member, CSI*; DZone MVB, and Java Code Geek. He holds a Bachelor of Engineering (Information Science & Engineering) from Sri Revana Siddeshwara Institute of Technology, completed the Executive Program in Data Mining & Analytics at the Indian Institute of Technology, and the Executive Certificate Program in Entrepreneurship at the Indian Institute of Management. His experience includes SCJP 1.4, SCJP 5.0, SCBCD 1.3, SCBCD 5.0, BB Spring 2.x*, BB Hibernate 3.x*, BB Java EE 6.x*, Quest C, Quest C++ and Quest Data Structures.

The post Java Multithreading Explained appeared first on Developer.com.

Read more: developer.com

Categories
Apps

Best Programming Languages to Learn in 2021 for Web Development

Best languages to learn in 2021 for Web Development

It might be a little redundant to specify that this article features languages employed in Web development since a lot of programming happens on that front these days. Nonetheless, if you’re looking to discover the latest and greatest way to build self-learning AI robots, you may or may not find it here. (Take a look at Go below.)

You don’t need to learn all of the programming languages presented here today; give them a try and decide which to add to your arsenal based on your requirements, aptitudes, and personal preferences.

Top Programming Languages at a Glance

Before we dive in, let’s get the lay of the land. Here were the top ten languages for 2020, according to a Gitpod poll:

Best Web Development Languages for Programmers 2021

 

These may change as 2021 unfolds, but that’s what we’re going by here today.

JavaScript

Back when I was a junior developer, I can vividly recall consultants scoffing at JavaScript, stating that it wasn’t a “real” language and would soon be replaced by something better. Fast forward to the present day, and JavaScript is the most popular language for web development in the world! Since its inauspicious start as a means of providing interactivity to Netscape’s Mosaic web browser back in 1993, JavaScript is now utilized in both the front and back end (Nodejs) of web applications as well as in mobile applications (React Native).

JavaScript’s unrivaled success is due to a number of factors:

Its forgiving and flexible syntax
It works across all major browsers
It is one of the friendliest programming languages for beginners

Python

Although Python has been around since the early nineties, I have somehow never gotten around to using it myself. According to those who have experience with Python, it’s one of the most versatile programming languages around. In addition to web development, Python is well suited to Data Science, Scripting, and Automation applications as well. Similar to JavaScript, Python is considered to be an excellent language to learn coding, especially if you are new to software development.

Thanks to its massive popularity, Python enjoys huge community support and has a lot of useful frameworks, libraries, and tools that can help you create a web application quickly. For example, you can use Django to create full-stack web applications. If you want something even more “Pythonic” you can also use Flask, which touts itself as a minimalist web development framework.

TypeScript

Now TypeScript is a language that I do know, mostly due to my experience with Angular. Some people refer to it as JavaScript++ because it is an extension of JavaScript that enforces type-safety. The idea is that it helps catch potential bugs during compilation, which IDEs like VS Code do in the background while you code.

TypeScript Compile Error

 

TypeScript 2.0 added the –strictNullChecks switch so that null and undefined values may only be assigned to variables that have been declared to accept them as values. In actual code, that would look like this:

let nullableVar: string | null;

The compiler also forces you to initialize variables at creation time or within the constructor. While such strict checks can be annoying while coding, they sure do help reduce the number of runtime bugs!

Ruby

Yukihiro “Matz” Matsumoto created Ruby by blending parts of his favorite languages (Perl, Smalltalk, Eiffel, Ada, and Lisp) to form a new language that combined elements of functional and imperative programming. In his own words, Matsumoto was “trying to make Ruby natural, not simple,” in a way that mirrors life. Since he first released Ruby in 1995, it has grown to become one of the most popular and beloved languages for web development.

Beginners are drawn to Ruby because it has achieved a reputation for having one of the friendliest and most helpful user communities. Add to that a straightforward syntax, the amazing Ruby on Rails web application framework, and association to great tech businesses, including Twitter, Airbnb, Bloomberg, and Shopify, and it becomes abundantly clear why Ruby has become so ubiquitous.

Go

Known as the little language that could, Go is really a low-level language that more closely resembles C and C++ than JavaScript or Ruby, without the difficult syntax and steep learning curve. Designed to run at blazing-fast speeds, it’s ideally suited to building web servers, data pipelines, and even machine-learning packages.

To act as a web server, Go relies on the net/HTTP package. Here’s the code to tells the HTTP package to handle all requests to the web root (“/”) with handler:

// +build ignore

package main

import (
“fmt”
“log”
“net/http”
)

func handler(w http.ResponseWriter, r *http.Request) {
fmt.Fprintf(w, “Hi there, I love %s!”, r.URL.Path[1:])
}

func main() {
http.HandleFunc(“/”, handler)
log.Fatal(http.ListenAndServe(“:8080”, nil))
}

HTML and CSS

Of course, we can’t talk about web development without including HTML and CSS. Though not programming languages per se, they remain the backbone for web development and, as such, remain at the forefront of that field. Both have grown tremendously since the early days of the World Wide Web. HTML5 and CSS3 have both greatly contributed to the responsivity of the modern Web – especially when combined with JavaScript!

If you want to get in on front-end development in 2021, then you must master HTML5 and CSS3. The good news is that you can easily do that in a few weeks as they are relatively easy to learn.

Conclusion

And there you have it, the best languages to learn for web development in 2021! When evaluating popular languages, try not to get caught up in trends and fads. Go with those that have been around for a little while and have enjoyed a steady rise to the top of the heap. The last thing you want is to find yourself with a bunch of applications using a defunct language.

 

Rob Gravelle resides in Ottawa, Canada, and has been an IT guru for over 20 years. In that time, Rob has built systems for intelligence-related organizations such as Canada Border Services and various commercial businesses. In his spare time, Rob has become an accomplished music artist with several CDs and digital releases to his credit.

The post Best Programming Languages to Learn in 2021 for Web Development appeared first on Developer.com.

Read more: developer.com

Categories
Apps

Previewing Microsoft’s OpenJDK

On April 6th, 2021, Microsoft announced the preview of the Microsoft Build of OpenJDK. It is a no-cost, open-source Long-Term Support (LTS) distribution of OpenJDK that is free for anyone to deploy anywhere.

OpenJDK includes binaries for Java 11, based on OpenJDK 11.0.10+9, on x64 server and desktop environments on macOS, Linux, and Windows. An Early Access binary for Java 16 for Windows on ARM, based on the latest OpenJDK 16+36 release, has also been published.

Microsoft has seen increasing growth in customer use of Java across their cloud services and development tools, and they are continually working to broaden and deepen our Java support for customers and developers.

The Microsoft Build of OpenJDK binaries for Java 11 have passed the Java Technology Compatibility Kit (TCK) for Java 11, which is used to verify compatibility with the Java 11 specification. This Build is a drop-in replacement for any other OpenJDK distribution available in the Java ecosystem.

During the past 18 months, Microsoft contributed more than 50 patches, including macOS packaging, build and infrastructure, GC fixes, enhancements, and JEP 388 – The Windows/AArch64 Port to run Java on Windows ARM devices like the Surface Pro X, for Windows to OpenJDK.

Microsoft’s goal is to have the Microsoft Build of OpenJDK to become the default distribution for Java 11 across Azure-managed services. This means that customers will not have to perform any maintenance tasks, as the transition will be transparent through application deployments.

You can download the Microsoft Build of OpenJDK here. Choose your Operating System option as shown here:

Microsoft-OpenJDK-Java

Figure 1 – OpenJDK Download Options

The post Previewing Microsoft’s OpenJDK appeared first on Developer.com.

Read more: developer.com