アプリケーションのグラフィカルインストーラーを開発しています。利用可能なインストーラー ジェネレーターのいずれも要件と制約を満たしていないため、ゼロから構築しています。
インストーラーは複数のオペレーティング システムで実行されることになっているため、パスの処理は OS に依存しない必要があります。この目的のために、次の小さなユーティリティを作成しました。
public class Path {
private Path() {
}
public static String join(String... pathElements) {
return ListEnhancer.wrap(Arrays.asList(pathElements)).
mkString(File.separator);
}
public static String concatOsSpecific(String path, String element) {
return path + File.separator + element;
}
public static String concatOsAgnostic(String path, String element) {
return path + "/" + element;
}
public static String makeOsAgnostic(String path) {
return path.replace(File.separator, "/");
}
public static String makeOsSpecific(String path) {
return new File(path).getAbsolutePath();
}
public static String fileName(String path) {
return new File(path).getName();
}
}
今、私のコードは散らばっていて、多くの場所Path.*Agnostic
でPath.*Specific
呼び出しています。明らかなように、これは非常にエラーが発生しやすく、まったく透過的ではありません。
パス処理を透過的にし、エラーが発生しにくいようにするには、どのようなアプローチを取る必要がありますか? この問題に既に対処しているユーティリティ/ライブラリはありますか? どんな助けでも大歓迎です。
編集:
私が言いたいことを例証するために、ここに私が少し前に書いたコードがあります。(オフトピック: 長い方法を許してください。コードは初期段階にあり、すぐにいくつかの重いリファクタリングが行われます。)
一部のコンテキスト:ApplicationContext
インストール データを格納するオブジェクトです。installationRootDirectory
これには、などのいくつかのパスが含まれますinstallationDirectory
。これらのデフォルトは、インストーラーの作成時に指定されるため、常に OS に依存しない形式で保存されます。
@Override
protected void initializeComponents() {
super.initializeComponents();
choosePathLabel = new JLabel("Please select the installation path:");
final ApplicationContext c = installer.getAppContext();
pathTextField = new JTextField(
Path.makeOsSpecific(c.getInstallationDirectory()));
browseButton = new JButton("Browse",
new ImageIcon("resources/images/browse.png"));
browseButton.addActionListener(new ActionListener() {
@Override
public void actionPerformed(ActionEvent e) {
JFileChooser fileChooser = new JFileChooser();
fileChooser.setFileSelectionMode(JFileChooser.DIRECTORIES_ONLY);
fileChooser.setAcceptAllFileFilterUsed(false);
int choice = fileChooser.showOpenDialog(installer);
String selectedInstallationRootDir = fileChooser.getSelectedFile().
getPath();
if (choice == JFileChooser.APPROVE_OPTION) {
c.setInstallationRootDirectory(
Path.makeOsAgnostic(selectedInstallationRootDir));
pathTextField.setText(Path.makeOsSpecific(c.getInstallationDirectory()));
}
}
});
}