List of Useful Environment Settings in Java

List of useful environment settings in Java

General Properties

I use this code to get a handle on some of the things known to Java classes that are of particular interest to me.

System Properties

import java.awt.*;
import javax.swing.*;
import javax.swing.border.EmptyBorder;
import java.util.*;

import java.security.*;

/** A small GUId app. that shows many system and environment properties.
Designed to be compatible with Java 1.4+ (hence many requirements like
no foreach, no generics, no StringBuilder..).
@author Andrew Thompson
@version 2008-06-29
*/
class SystemProperties {

static String sentence = "The quick brown fox jumped over the lazy dog.";
static String sep = System.getProperty("line.separator");
static String fontText =
sentence +
sep +
sentence.toUpperCase() +
sep +
"0123456789 !@#$%^&*()_+ []\\;',./ {}|:\"<>?";

static String[] convertObjectToSortedStringArray(Object[] unsorted) {
String[] sorted = new String[unsorted.length];
for (int ii = 0; ii < sorted.length; ii++) {
sorted[ii] = (String) unsorted[ii];
}
Arrays.sort(sorted);
return sorted;
}

static String dataPairToTableRow(String property, Object value) {
String val = valueToString(property, value);
return "<tr>" +
"<th>" +
"<code>" +
property +
"</code>" +
"</th>" +
"<td>" +
val +
"</td>" +
"</tr>";
}

static String valueToString(String property, Object value) {
if (value instanceof Color) {
Color color = (Color) value;
String converted =
"<div style='width: 100%; height: 100%; " +
"background-color: #" +
Integer.toHexString(color.getRed()) +
Integer.toHexString(color.getGreen()) +
Integer.toHexString(color.getBlue()) +
";'>" +
value.toString() +
"</div>";
return converted;
} else if (property.toLowerCase().endsWith("path") ||
property.toLowerCase().endsWith("dirs")) {
return delimitedToHtmlList(
(String) value,
System.getProperty("path.separator"));
} else {
return value.toString();
}
}

static String delimitedToHtmlList(String values, String delimiter) {
String[] parts = values.split(delimiter);
StringBuffer sb = new StringBuffer();
sb.append("<ol>");
for (int ii = 0; ii < parts.length; ii++) {
sb.append("<li>");
sb.append(parts[ii]);
sb.append("</li>");
}
return sb.toString();
}

static Component getExampleOfFont(String fontFamily) {
Font font = new Font(fontFamily, Font.PLAIN, 24);
JTextArea ta = new JTextArea();
ta.setFont(font);
ta.setText(fontText);
ta.setEditable(false);
// don't allow these to get focus, as it
// interferes with desired scroll behavior
ta.setFocusable(false);
return ta;
}

static public JScrollPane getOutputWidgetForContent(String content) {
JEditorPane op = new JEditorPane();
op.setContentType("text/html");
op.setEditable(false);

op.setText(content);

return new JScrollPane(op);
}

public static void main(String[] args) {
JTabbedPane tabPane = new JTabbedPane();
StringBuffer sb;
String header = "<html><body><table border=1 width=100%>";

sb = new StringBuffer(header);
Properties prop = System.getProperties();
String[] propStrings = convertObjectToSortedStringArray(
prop.stringPropertyNames().toArray());
for (int ii = 0; ii < propStrings.length; ii++) {
sb.append(
dataPairToTableRow(
propStrings[ii],
System.getProperty(propStrings[ii])));
}
tabPane.addTab(
"System",
getOutputWidgetForContent(sb.toString()));

sb = new StringBuffer(header);
Map environment = System.getenv();
String[] envStrings = convertObjectToSortedStringArray(
environment.keySet().toArray());
for (int ii = 0; ii < envStrings.length; ii++) {
sb.append(
dataPairToTableRow(
envStrings[ii],
environment.get(envStrings[ii])));
}
tabPane.addTab(
"Environment",
getOutputWidgetForContent(sb.toString()));

sb = new StringBuffer(header);
GraphicsEnvironment ge = GraphicsEnvironment.getLocalGraphicsEnvironment();
GraphicsDevice[] gs = ge.getScreenDevices();
for (int j = 0; j < gs.length; j++) {
GraphicsDevice gd = gs[j];
sb.append(
dataPairToTableRow(
"Device " + j,
gd.toString() +
" " +
gd.getIDstring()));
GraphicsConfiguration[] gc =
gd.getConfigurations();
for (int i = 0; i < gc.length; i++) {
sb.append(
dataPairToTableRow(
"Config " +
i,
(int) gc[i].getBounds().getWidth() +
"x" +
(int) gc[i].getBounds().getHeight() +
" " +
gc[i].getColorModel() +
", " +
" Accelerated: " +
gc[i].getImageCapabilities().isAccelerated() +
" True Volatile: " +
gc[i].getImageCapabilities().isTrueVolatile()));
}
}
tabPane.addTab(
"Graphics Environment",
getOutputWidgetForContent(sb.toString()));

String[] fonts = ge.getAvailableFontFamilyNames();
JPanel fontTable = new JPanel(new BorderLayout(3, 1));
// to enable key based scrolling in the font panel
fontTable.setFocusable(true);
JPanel fontNameCol = new JPanel(new GridLayout(0, 1, 2, 2));
JPanel fontExampleCol = new JPanel(new GridLayout(0, 1, 2, 2));
fontTable.add(fontNameCol, BorderLayout.WEST);
fontTable.add(fontExampleCol, BorderLayout.CENTER);
for (int ii = 0; ii < fonts.length; ii++) {
fontNameCol.add(new JLabel(fonts[ii]));
fontExampleCol.add(getExampleOfFont(fonts[ii]));
}
tabPane.add("Fonts", new JScrollPane(fontTable));

sb = new StringBuffer(header);

sb.append("<thead>");
sb.append("<tr>");
sb.append("<th>");
sb.append("Code");
sb.append("</th>");
sb.append("<th>");
sb.append("Language");
sb.append("</th>");
sb.append("<th>");
sb.append("Country");
sb.append("</th>");
sb.append("<th>");
sb.append("Variant");
sb.append("</th>");
sb.append("</tr>");
sb.append("</thead>");

Locale[] locales = Locale.getAvailableLocales();
SortableLocale[] sortableLocale = new SortableLocale[locales.length];
for (int ii = 0; ii < locales.length; ii++) {
sortableLocale[ii] = new SortableLocale(locales[ii]);
}
Arrays.sort(sortableLocale);
for (int ii = 0; ii < locales.length; ii++) {
String prefix = "";
String suffix = "";
Locale locale = sortableLocale[ii].getLocale();
if (locale.equals(Locale.getDefault())) {
prefix = "<b>";
suffix = "</b>";
}
sb.append(dataPairToTableRow(
prefix +
locale.toString() +
suffix,
prefix +
locale.getDisplayLanguage() +
suffix +
"</td><td>" +
prefix +
locale.getDisplayCountry() +
suffix +
"</td><td>" +
prefix +
locale.getDisplayVariant() +
suffix));
}
tabPane.add("Locales",
getOutputWidgetForContent(sb.toString()));

Locale.getDefault();
int border = 5;
JPanel p = new JPanel(new BorderLayout());
p.setBorder(new EmptyBorder(border, border, border, border));
p.add(tabPane, BorderLayout.CENTER);
p.setPreferredSize(new Dimension(400, 400));
JFrame f = new JFrame("Properties");
f.setDefaultCloseOperation(JFrame.DISPOSE_ON_CLOSE);
f.getContentPane().add(p, BorderLayout.CENTER);
f.pack();
f.setMinimumSize(f.getPreferredSize());
f.setSize(600, 500);
f.setLocationRelativeTo(null);
f.setVisible(true);
}
}

class SortableLocale implements Comparable {

Locale locale;

SortableLocale(Locale locale) {
this.locale = locale;
}

public String toString() {
return locale.toString();
}

public Locale getLocale() {
return locale;
}

public int compareTo(Object object2) {
SortableLocale locale2 = (SortableLocale) object2;
//Locale locale2 = (Locale)object2;
return locale.toString().compareTo(
locale2.toString());
}
}

Media

Properties related to synthesized and sampled sound, and images.

Media Types

/*
<applet
code='MediaTypes'
width='900'
height='600'>
<param name='show' value='Sound|Sampled|Mixers|Primary Sound Capture Driver'>
</applet>
*/
import javax.imageio.ImageIO;
import javax.sound.sampled.*;
import javax.sound.midi.*;
import java.awt.*;
import javax.swing.*;
import javax.swing.table.DefaultTableModel;
import javax.swing.tree.*;
import javax.swing.event.*;
import javax.swing.text.Position;

public class MediaTypes extends JApplet {

JTable table;
boolean sortable = false;
JTree tree;

@Override
public void init() {
Runnable r = () -> {
MediaTypes mediaTypes = new MediaTypes();

String show = "";
if (getParameter("show")!=null) {
show = getParameter("show");
}

JPanel p = new JPanel();
mediaTypes.createGui(p, show);
add(p);
validate();
};
SwingUtilities.invokeLater(r);
}

public static void main(String[] args) {
Runnable r = () -> {
MediaTypes mediaTypes = new MediaTypes();

JPanel p = new JPanel();
mediaTypes.createGui(p);
JOptionPane.showMessageDialog(null,p);
};
SwingUtilities.invokeLater(r);
}

public Object[][] mergeArrays(String name1, Object[] data1, String name2, Object[] data2) {
Object[][] data = new Object[data1.length+data2.length][2];
for (int ii=0; ii<data1.length; ii++) {
data[ii][0] = name1;
data[ii][1] = data1[ii];
}
int offset = data1.length;
for (int ii=offset; ii<data.length; ii++) {
data[ii][0] = name2;
data[ii][1] = data2[ii-offset];
}
return data;
}

public void createGui(JPanel panel) {
createGui(panel, "");
}

public String getShortLineName(String name) {
String[] lineTypes = {
"Clip",
"SourceDataLine",
"TargetDataLine",
"Speaker",
"Microphone",
"Master Volume",
"Line In"
};
for (String shortName : lineTypes) {
if ( name.toLowerCase().replaceAll("_", " ").contains(shortName.toLowerCase() )) {
return shortName;
}
}
return name;
}

public void createGui(JPanel panel, String path) {

//DefaultMutableTreeNode selected = null;

panel.setLayout( new BorderLayout(5,5) );
final JLabel output = new JLabel("Select a tree leaf to see the details.");
panel.add(output, BorderLayout.SOUTH);

table = new JTable();
try {
table.setAutoCreateRowSorter(true);
sortable = true;
} catch (Throwable ignore) {
// 1.6+ functionality - not vital
}
JScrollPane tableScroll = new JScrollPane(table);
Dimension d = tableScroll.getPreferredSize();
d = new Dimension(450,d.height);
tableScroll.setPreferredSize(d);
panel.add( tableScroll, BorderLayout.CENTER );

DefaultMutableTreeNode rootNode = new DefaultMutableTreeNode("Media");
DefaultTreeModel treeModel = new DefaultTreeModel(rootNode);

DefaultMutableTreeNode imageNode = new DefaultMutableTreeNode("Image");
rootNode.add(imageNode);

Object[][] data;
int offset;
String[] columnNames;

data = mergeArrays(
"Reader",
ImageIO.getReaderFileSuffixes(),
"Writer",
ImageIO.getWriterFileSuffixes() );
columnNames = new String[]{"Input/Output", "Image File Suffixes"};
MediaData md = new MediaData( "Suffixes", columnNames, data);
imageNode.add(new DefaultMutableTreeNode(md));

data = mergeArrays(
"Reader",
ImageIO.getReaderMIMETypes(),
"Writer",
ImageIO.getWriterMIMETypes() );
columnNames = new String[]{"Input/Output", "Image MIME Types"};
md = new MediaData( "MIME", columnNames, data);
imageNode.add(new DefaultMutableTreeNode(md));

DefaultMutableTreeNode soundNode = new DefaultMutableTreeNode("Sound");
rootNode.add(soundNode);

DefaultMutableTreeNode soundSampledNode = new DefaultMutableTreeNode("Sampled");
soundNode.add(soundSampledNode);

md = new MediaData("Suffixes", "Sound File Suffixes", AudioSystem.getAudioFileTypes());
soundSampledNode.add(new DefaultMutableTreeNode(md));

Mixer.Info[] mixerInfo = AudioSystem.getMixerInfo();
String[][] mixerData = new String[mixerInfo.length][4];
for (int ii=0; ii<mixerData.length; ii++) {
mixerData[ii][0] = mixerInfo[ii].getName();
mixerData[ii][1] = mixerInfo[ii].getVendor();
mixerData[ii][2] = mixerInfo[ii].getVersion();
mixerData[ii][3] = mixerInfo[ii].getDescription();
}
columnNames = new String[]{"Name", "Vendor", "Version", "Description"};
md = new MediaData("Mixers", columnNames, mixerData);
DefaultMutableTreeNode soundSampledMixersNode = new DefaultMutableTreeNode(md);
soundSampledNode.add(soundSampledMixersNode);

for (Mixer.Info mixerInfo1 : mixerInfo) {
Mixer mixer = AudioSystem.getMixer(mixerInfo1);
data = mergeArrays(
"Source",
mixer.getSourceLineInfo(),
"Target",
mixer.getTargetLineInfo() );
columnNames = new String[]{ "Input/Output", "Line Info" };
md = new MediaData(mixerInfo1.getName(), columnNames, data);
DefaultMutableTreeNode soundSampledMixerNode = new DefaultMutableTreeNode(md);
soundSampledMixersNode.add( soundSampledMixerNode );
Line.Info[] source = mixer.getSourceLineInfo();
Line.Info[] target = mixer.getTargetLineInfo();
Line[] all = new Line[source.length + target.length];
try {
for (int jj=0; jj<source.length; jj++) {
all[jj] = AudioSystem.getLine(source[jj]);
}
for (int jj=source.length; jj<all.length; jj++) {
all[jj] = AudioSystem.getLine(target[jj-source.length]);
}
columnNames = new String[]{"Attribute", "Value"};
for (Line line : all) {
Control[] controls = line.getControls();
if (line instanceof DataLine) {
DataLine dataLine = (DataLine)line;
AudioFormat audioFormat = dataLine.getFormat();
data = new Object[7+controls.length][2];

data[0][0] = "Channels";
data[0][1] = audioFormat.getChannels();

data[1][0] = "Encoding";
data[1][1] = audioFormat.getEncoding();

data[2][0] = "Frame Rate";
data[2][1] = audioFormat.getFrameRate();

data[3][0] = "Sample Rate";
data[3][1] = audioFormat.getSampleRate();

data[4][0] = "Sample Size (bits)";
data[4][1] = audioFormat.getSampleSizeInBits();

data[5][0] = "Big Endian";
data[5][1] = audioFormat.isBigEndian();

data[6][0] = "Level";
data[6][1] = dataLine.getLevel();

} else if (line instanceof Port) {
Port port = (Port)line;
Port.Info portInfo = (Port.Info)port.getLineInfo();
data = new Object[2+controls.length][2];

data[0][0] = "Name";
data[0][1] = portInfo.getName();

data[1][0] = "Source";
data[1][1] = portInfo.isSource();
} else {
System.out.println( "?? " + line );
}
int start = data.length-controls.length;
for (int kk=start; kk<data.length; kk++) {
data[kk][0] = "Control";
int index = kk-start;
data[kk][1] = controls[index];
}
md = new MediaData(getShortLineName(line.getLineInfo().toString()), columnNames, data);
soundSampledMixerNode.add(new DefaultMutableTreeNode(md));
}
} catch(Exception e) {
e.printStackTrace();
}
}

int[] midiTypes = MidiSystem.getMidiFileTypes();
data = new Object[midiTypes.length][2];
for (int ii=0; ii<midiTypes.length; ii++) {
data[ii][0] = midiTypes[ii];
String description = "Unknown";
switch (midiTypes[ii]) {
case 0:
description = "Single Track";
break;
case 1:
description = "Multi Track";
break;
case 2:
description = "Multi Song";
}
data[ii][1] = description;
}
columnNames = new String[]{"Type", "Description"};
md = new MediaData("MIDI", columnNames, data);
DefaultMutableTreeNode soundMIDINode = new DefaultMutableTreeNode(md);
soundNode.add(soundMIDINode);

columnNames = new String[]{
"Attribute",
"Value"};
MidiDevice.Info[] midiDeviceInfo = MidiSystem.getMidiDeviceInfo() ;
for (MidiDevice.Info midiDeviceInfo1 : midiDeviceInfo) {
data = new Object[6][2];
data[0][0] = "Name";
data[0][1] = midiDeviceInfo1.getName();
data[1][0] = "Vendor";
data[1][1] = midiDeviceInfo1.getVendor();
data[2][0] = "Version";
String version = midiDeviceInfo1.getVersion();
data[2][1] = version.replaceAll("Version ", "");
data[3][0] = "Description";
data[3][1] = midiDeviceInfo1.getDescription();
data[4][0] = "Maximum Transmitters";
data[5][0] = "Maximum Receivers";
try {
MidiDevice midiDevice = MidiSystem.getMidiDevice(midiDeviceInfo1);
Object valueTransmitter;
if (midiDevice.getMaxTransmitters()==AudioSystem.NOT_SPECIFIED) {
valueTransmitter = "Not specified";
} else {
valueTransmitter = midiDevice.getMaxTransmitters();
}
Object valueReceiver;
if (midiDevice.getMaxReceivers()==AudioSystem.NOT_SPECIFIED) {
valueReceiver = "Not specified";
} else {
valueReceiver = midiDevice.getMaxReceivers();
}
data[4][1] = valueTransmitter;
data[5][1] = valueReceiver;
}catch(MidiUnavailableException mue) {
data[4][1] = "Unknown";
data[5][1] = "Unknown";
}
md = new MediaData(midiDeviceInfo1.getName(), columnNames, data);
soundMIDINode.add( new DefaultMutableTreeNode(md) );
}

tree = new JTree(treeModel);
tree.setRootVisible(false);
tree.getSelectionModel().setSelectionMode
(TreeSelectionModel.SINGLE_TREE_SELECTION);
tree.addTreeSelectionListener((TreeSelectionEvent tse) -> {
if (sortable) {
output.setText("Click table column headers to sort.");
}

DefaultMutableTreeNode node = (DefaultMutableTreeNode)
tree.getLastSelectedPathComponent();

if (node == null) return;

Object nodeInfo = node.getUserObject();
if (nodeInfo instanceof MediaData) {
MediaData mediaData = (MediaData)nodeInfo;
table.setModel( new DefaultTableModel(
mediaData.getData(),
mediaData.getColumnNames()) );
}
});

for (int ii=0; ii<tree.getRowCount(); ii++) {
tree.expandRow(ii);
}

String[] paths = path.split("\\|");
int row = 0;
TreePath treePath = null;
for (String prefix : paths) {
treePath = tree.getNextMatch( prefix, row, Position.Bias.Forward );
row = tree.getRowForPath(treePath);
}

panel.add(new JScrollPane(tree),BorderLayout.WEST);

tree.setSelectionPath(treePath);
tree.scrollRowToVisible(row);
}
}

class MediaData {

String name;
String[] columnNames;
Object[][] data;

MediaData(String name, String columnName, Object[] data) {
this.name = name;

columnNames = new String[1];
columnNames[0] = columnName;

this.data = new Object[data.length][1];
for (int ii=0; ii<data.length; ii++) {
this.data[ii][0] = data[ii];
}
}

MediaData(String name, String[] columnNames, Object[][] data) {
this.name = name;
this.columnNames = columnNames;
this.data = data;
}

@Override
public String toString() {
return name;
}

public String[] getColumnNames() {
return columnNames;
}

public Object[][] getData() {
return data;
}
}

Other

You might also investigate:

  • InetAddress
  • KeyStore
  • Managers

    • CookieManager
    • KeyManagerFactory
    • LogManager

Environment variables for list in spring boot configuration

Suggestion, don't overcomplicate.

Say you want that list as an Environment variable. You'd set it using

-Dtopics=topic-01,topic-02,topic-03

You then can recover it using the injected Environment Bean, and create a new List<String> Bean

@Bean
@Qualifier("topics")
List<String> topics(final Environment environment) {
final var topics = environment.getProperty("topics", "");
return Arrays.asList(topics.split(","));
}

From now on, that List can be @Autowired.

You can also consider creating your custom qualifier annotation, maybe @Topics.

Then

@Service
class TopicService {
@Topics
@Autowired
private List<String> topics;

...
}

Or even

@Service
class TopicService {
private final List<String> topics;

TopicService(@Topics final List<String> topics) {
this.topics = topics;
}

...
}

What you could do is use an externalized file.

Pass to the environment parameters the path to that file.

-DtopicsPath=C:/whatever/path/file.json

Than use the Environment Bean to recover that path. Read the file content and ask Jackson to deserialize it

You'd also need to create a simple Topic class

public class Topic {
public String name;
public String id;
}

Which represents an element of this JSON array

[
{
"name": "topic-1",
"id": "id-1"
},
{
"name": "topic-2",
"id": "id-2"
}
]

@Bean
List<Topic> topics(
final Environment environment,
final ObjectMapper objectMapper) throws IOException {
// Get the file path
final var topicsPath = environment.getProperty("topicsPath");

if (topicsPath == null) {
return Collections.emptyList();
}

// Read the file content
final var json = Files.readString(Paths.get(topicsPath));

// Convert the JSON to Java objects
final var topics = objectMapper.readValue(json, Topic[].class);
return Arrays.asList(topics);
}

Sample Image

How to enumerate all environment variable in Java

System.getenv() will return a Map<String,String> with all of the environment variables.

But you could just as easily switch to ProcessBuilder which is a more convenient API to start new processes.

With ProcessBuilder you can simply call environment() and get a Map that contains existing environment variables and which you can manipulate how you want: i.e., if you add something to it, then that will be added to the new processes environment variables. If you remove something from it, it will not be present in the new process.

How do I set environment variables from Java?

(Is it because this is Java and therefore I shouldn't be doing evil nonportable obsolete things like touching my environment?)

I think you've hit the nail on the head.

A possible way to ease the burden would be to factor out a method

void setUpEnvironment(ProcessBuilder builder) {
Map<String, String> env = builder.environment();
// blah blah
}

and pass any ProcessBuilders through it before starting them.

Also, you probably already know this, but you can start more than one process with the same ProcessBuilder. So if your subprocesses are the same, you don't need to do this setup over and over.

Java system properties and environment variables

I think the difference between the two boils down to access. Environment variables are accessible by any process and Java system properties are only accessible by the process they are added to.

Also as Bohemian stated, env variables are set in the OS (however they 'can' be set through Java) and system properties are passed as command line options or set via setProperty().

How to use environment variables in CMD using Java?

It strikes me that the simplest solution is:

builder.command("ffmpeg", "-i", w ,"-i", a, "-vcodec", "copy" ,"output.mp4");

There is no need to set environment variables if you are only going to use them to inject command line arguments.

However, if you do want to do it via environment variables, then the simple way is to use a subshell to do all of the command line parsing and expansion; e.g.

builder.command("/bin/sh", "-c", 
"ffmpeg -i $WINDOW -i $AUDIO -vcodec copy output.mp4");

You could also use quoting, globbing, pipelines, redirection and all of the other fancy shell features.



Related Topics



Leave a reply



Submit