2016-08-28 8 views
4

Мы всегда хотим, чтобы наша среда разработки/тестирования была такой же, как и у нас, но часто мы можем быть пойманы в ловушке использования функций JDK, которые не отображают зависимость среды очень явно (например, параметр требуемого метода) или могут быть тонкими для обнаружения и осознанный. Например:Как я могу найти полный список зависящих от платформы ловушек в JDK, таких как часовой пояс, кодирование, концы строк и т. Д.?

  • public String(byte bytes[]) использует кодировку по умолчанию
  • new Date()/Instant.now() использует Sytem TIMEZONE
  • System.out.printf("%n") использует окончания платформы линии

Некоторые из них можно управлять параметрами виртуальной машины Java, как -Dfile.encoding=UTF-8.

Но как найти все такие ошибки?

+0

Вы имеете в виду найти использования внутри набора исходных кодов ? – Kayaman

+0

@ Kayaman Это вариант, но я надеюсь, что какой-то официальный список, открытый командой JDK dev, существует или что-то в этом роде. –

+1

Ну, я никогда не сталкивался с официальным исчерпывающим списком (через ~ 20 лет), так что он оставил бы ответственность опытного разработчика, чтобы знать, что они делают. Я могу представить, что есть некоторые неофициальные короткие списки, но их поиск, вероятно, попадет под «Закрыть> Вне темы> Внешний ресурс». – Kayaman

ответ

2

Тип gotchas зависит от типа вашего приложения.

Для почти полного списка вы можете запустить эту проверку, в котором перечислены как переменные среды операционной системы и системы Java свойства:

import java.awt.GraphicsEnvironment; 
import java.util.Map; 
import java.util.Properties; 

public class Sof39189179 { 

    public static void main(String[] args) { 

     Map<String, String> sysenv = System.getenv(); 

     for(String key: sysenv.keySet()) 
      System.out.println(key + ": " + sysenv.get(key)); 

     Properties properties = System.getProperties(); 

     for(Object key: properties.keySet()) 
      System.out.println(key + ": " + properties.get(key)); 

     GraphicsEnvironment ge = GraphicsEnvironment.getLocalGraphicsEnvironment(); 
     System.out.println("headless: " + ge.isHeadless()); 
    } 
} 

На моем компьютере, я получаю следующий вывод (я опустили некоторые строки):

M2: $M2_HOME/bin 
JAVA_HOME: /opt/local/jdk-1.8.0_51 
LANG: en_US.UTF-8 
CATALINA_HOME: /opt/local/tomcat-8.0.24 

... 

--------------------- 
java.runtime.name: Java(TM) SE Runtime Environment 
sun.boot.library.path: /opt/local/jdk-1.8.0_51/jre/lib/amd64 
java.vm.version: 25.51-b03 
java.vm.vendor: Oracle Corporation 
java.vendor.url: http://java.oracle.com/ 
path.separator: : 
java.vm.name: Java HotSpot(TM) 64-Bit Server VM 
file.encoding.pkg: sun.io 
user.country: US 
sun.java.launcher: SUN_STANDARD 
sun.os.patch.level: unknown 
java.vm.specification.name: Java Virtual Machine Specification 
user.dir: /home/rudolf/workspace/neon/sof39189179 
java.runtime.version: 1.8.0_51-b16 
java.awt.graphicsenv: sun.awt.X11GraphicsEnvironment 
java.endorsed.dirs: /opt/local/jdk-1.8.0_51/jre/lib/endorsed 
os.arch: amd64 
java.io.tmpdir: /tmp 
line.separator: 

java.vm.specification.vendor: Oracle Corporation 
os.name: Linux 
... 

java.awt.printerjob: sun.print.PSPrinterJob 
file.encoding: UTF-8 
java.specification.version: 1.8 
java.class.path: /home/rudolf/workspace/neon/sof39189179/bin 
user.name: rudolf 
java.vm.specification.version: 1.8 
java.home: /opt/local/jdk-1.8.0_51/jre 
sun.arch.data.model: 64 
user.language: en 
java.specification.vendor: Oracle Corporation 
awt.toolkit: sun.awt.X11.XToolkit 
java.vm.info: mixed mode 
java.version: 1.8.0_51 
java.ext.dirs: /opt/local/jdk-1.8.0_51/jre/lib/ext:/usr/java/packages/lib/ext 
sun.boot.class.path: /opt/local/jdk-1.8.0_51/jre/lib/resources.jar:/opt/local/jdk-1.8.0_51/jre/lib/rt.jar:/opt/local/jdk-1.8.0_51/jre/lib/sunrsasign.jar:/opt/local/jdk-1.8.0_51/jre/lib/jsse.jar:/opt/local/jdk-1.8.0_51/jre/lib/jce.jar:/opt/local/jdk-1.8.0_51/jre/lib/charsets.jar:/opt/local/jdk-1.8.0_51/jre/lib/jfr.jar:/opt/local/jdk-1.8.0_51/jre/classes 
java.vendor: Oracle Corporation 
file.separator:/
java.vendor.url.bug: http://bugreport.sun.com/bugreport/ 
sun.io.unicode.encoding: UnicodeLittle 
sun.cpu.endian: little 
sun.cpu.isalist: 
headless: false 

Вы можете определить из этого списка, какие свойства имеют отношение к вашему делу и проверить свой код. Или, лучше, код с этими свойствами.

System.out.printf («% п») использует окончания платформы линии

Я предпочитаю использовать перечисленное выше свойство, то есть для распечатки перевода строки, я использую нечто вроде:

String newline = (String) System.getProperties().get("line.separator"); 
System.out.println("newline: " + newline); 
2

Не прямой ответ на ваш вопрос, но -XX:+PrintFlagsFinal и -XshowSettings:all помогает в сравнении разных сред. Эти флаги будут отображаться по умолчанию (параметры, зависящие от оборудования/os) jvm и свойства env/system.

Вам также необходимо сравнить параметры ОС, как переменные окружения, пределы OS/квота, параметры безопасности, настройки файловой системы и т.д.

2

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

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

  • Создать новую тему? С учетом ограничений ОС.
  • Хотите запланировать задачу с точностью до наносекунды? Точность таймера доступна на платформе.
  • Имена файлов?Зависит от того, что поддерживает файловая система.
  • Открыть розетку? Доступные диапазоны портов настраиваются ОС.
  • ...

В общих посоветуйте: Прочитайте документацию из API, которые вы используете, и знать, какие функции ОС лежат в основе их

 Смежные вопросы

  • Нет связанных вопросов^_^