/* * Copyright 2000-2017 JetBrains s.r.o. * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */ package org.jetbrains.jps.model.java.impl; import com.intellij.openapi.util.SystemInfo; import com.intellij.openapi.util.io.FileFilters; import com.intellij.openapi.util.io.FileUtil; import com.intellij.openapi.util.io.FileUtilRt; import com.intellij.openapi.util.registry.Registry; import com.intellij.util.ArrayUtil; import com.intellij.util.containers.ContainerUtil; import org.jetbrains.annotations.NotNull; import org.jetbrains.annotations.Nullable; import java.io.File; import java.io.FileFilter; import java.io.IOException; import java.util.List; import java.util.Set; import static com.intellij.util.ObjectUtils.notNull; /** * @author nik */ public class JavaSdkUtil { @NotNull public static List<File> getJdkClassesRoots(@NotNull File home, boolean isJre) { File[] jarDirs; if (SystemInfo.isMac && !home.getName().startsWith("mockJDK")) { File openJdkRtJar = new File(home, "jre/lib/rt.jar"); if (openJdkRtJar.isFile()) { File libDir = new File(home, "lib"); File classesDir = openJdkRtJar.getParentFile(); File libExtDir = new File(openJdkRtJar.getParentFile(), "ext"); File libEndorsedDir = new File(libDir, "endorsed"); jarDirs = new File[]{libEndorsedDir, libDir, classesDir, libExtDir}; } else { File libDir = new File(home, "lib"); File classesDir = new File(home, "../Classes"); File libExtDir = new File(libDir, "ext"); File libEndorsedDir = new File(libDir, "endorsed"); jarDirs = new File[]{libEndorsedDir, libDir, classesDir, libExtDir}; } } else if (new File(home, "lib/jrt-fs.jar").exists()) { jarDirs = ArrayUtil.EMPTY_FILE_ARRAY; } else { File libDir = new File(home, isJre ? "lib" : "jre/lib"); File libExtDir = new File(libDir, "ext"); File libEndorsedDir = new File(libDir, "endorsed"); jarDirs = new File[]{libEndorsedDir, libDir, libExtDir}; } FileFilter jarFileFilter = FileFilters.filesWithExtension("jar"); Set<String> pathFilter = ContainerUtil.newTroveSet(FileUtil.PATH_HASHING_STRATEGY); List<File> rootFiles = ContainerUtil.newArrayList(); if (Registry.is("project.structure.add.tools.jar.to.new.jdk")) { File toolsJar = new File(home, "lib/tools.jar"); if (toolsJar.isFile()) { rootFiles.add(toolsJar); } } for (File jarDir : jarDirs) { if (jarDir != null && jarDir.isDirectory()) { File[] jarFiles = notNull(jarDir.listFiles(jarFileFilter), ArrayUtil.EMPTY_FILE_ARRAY); for (File jarFile : jarFiles) { String jarFileName = jarFile.getName(); if (jarFileName.equals("alt-rt.jar") || jarFileName.equals("alt-string.jar")) { continue; // filter out alternative implementations } String canonicalPath = getCanonicalPath(jarFile); if (canonicalPath == null || !pathFilter.add(canonicalPath)) { continue; // filter out duplicate (symbolically linked) .jar files commonly found in OS X JDK distributions } rootFiles.add(jarFile); } } } String[] ibmJdkVmJarDirs = {"bin/default", "lib/i386/default", "lib/amd64/default"}; for (String relativePath : ibmJdkVmJarDirs) { File libDir = new File(home, isJre ? relativePath : "jre/" + relativePath); File[] vmJarDirs = notNull(libDir.listFiles(FileUtilRt.ALL_DIRECTORIES), ArrayUtil.EMPTY_FILE_ARRAY); for (File dir : vmJarDirs) { if (dir.getName().startsWith("jclSC")) { File vmJar = new File(dir, "vm.jar"); if (vmJar.isFile()) { rootFiles.add(vmJar); } } } } File classesZip = new File(home, "lib/classes.zip"); if (classesZip.isFile()) { rootFiles.add(classesZip); } if (rootFiles.isEmpty()) { File classesDir = new File(home, "classes"); if (classesDir.isDirectory()) { rootFiles.add(classesDir); } } return rootFiles; } @Nullable private static String getCanonicalPath(File file) { try { return file.getCanonicalPath(); } catch (IOException e) { return null; } } }