Çalışan JAR faylı yolunu necə almaq olar?

Mənim kodum bir JAR faylı içərisində, foo.jar deyir və mən foo.jar qovluğunda çalışan kodu bilmək məcburiyyətindəyəm.

Beləliklə, əgər foo.jar C:\FOO\ olduğunda, bu yolun mənim cari iş kitabım nə olursa olsun olsun.

504
26 нояб. Thiago Chaves tərəfindən qoyulmuş 26 noyabr. 2008-11-26 15:30 '08 saat 15:30 'da 2008-11-26 15:30
ответ 31 cavab
  • 1
  • 2
 return new File(MyClass.class.getProtectionDomain().getCodeSource().getLocation().toURI()).getPath(); 

Sınıfınızın adıyla "MyClass" i dəyişdirin.

Şübhəsiz ki, sinifiniz qeyri-fayldan yüklənmişdirsə, bu, tək şeylər edər.

468
26 нояб. Cavab Zarkonnen Noyabr 26 verilir 2008-11-26 15:50 '08 at 15:50 2008-11-26 15:50

Mənim üçün ən yaxşı həll:

 String path = Test.class.getProtectionDomain().getCodeSource().getLocation().getPath(); String decodedPath = URLDecoder.decode(path, "UTF-8"); 
border=0

Bu problem boşluqlar və xüsusi simvollarla həll edilməlidir.

180
27 июля '11 в 21:22 2011-07-27 21:22 cavab 27 iyul 2011-ci il tarixində saat 21: 22-də verilir

Bu Class üçün File almaq üçün iki addım vardır:

  • Class URL'ye URL
  • File Dosyaya Dönüştür

Hər iki addımı başa düşmək və onları birləşdirmək vacibdir.

getParentFile olduqdan sonra, getParentFile i ehtiva edən bir qovluq almaq üçün zəng edə bilərsiniz.

Addım 1: URL

Digər cavablarda müzakirə edildiyi kimi, Class ilə bağlı URL tapmaq üçün iki əsas yol vardır.

  • URL url = Bar.class.getProtectionDomain().getCodeSource().getLocation();

  • URL url = Bar.class.getResource(Bar.class.getSimpleName() + ".class");

Hər ikisi də müsbət və mənfi cəhətləri var.

getProtectionDomain yanaşması bir əsas sinif yerini təmin edir (məsələn, bir JAR faylını ehtiva edir). Buna baxmayaraq, Java runtime təhlükəsizlik siyasəti, getProtectionDomain() SecurityException atmaq mümkündür, buna görə tətbiqinizin müxtəlif mühitlərdə işləməsi lazımdırsa, bunların hamısını sınamaq yaxşıdır.

getResource yanaşma, əlavə simli manipulasyonları yerinə yetirmək üçün lazım olan sinif URL resursunun tam yolunu verir. Bu file: ola bilər file: yolu, amma həmçinin jar:file: ola bilər jar:file: və ya bundleresource://346.fwk2106232034:4/foo/Bar.class ərzində çalışan daha xoşagəlməz bir şey. Bunun əksinə, getProtectionDomain yanaşma düzgün şəkildə file: verir file: URL file: hətta OSGi içərisindən.

Sinif bir JAR faylı getResource("") həm getResource("") həm də getResource("") getResource(".") Testləri getResource(".") deyil; hər iki zəng geri qaytarıldı. Buna görə də, daha təhlükəsiz görünür kimi yuxarıda göstərilən # 2 zənginin yerinə gəlir.

Addım 2: URL File

Hər hansı bir halda, bir URL , növbəti addım File çevrilir. Bu, öz vəzifəsidir; Bu barədə Kohsuke Kawaguchi blog yazısına baxın, lakin ümumiyyətlə, URL tamamilə yaranana qədər new File(url.toURI()) istifadə edə bilərsiniz.

Nəhayət, mən URLDecoder istifadəsini URLDecoder . Bəzi URL simvolları: və / xüsusən, etibarlı URL kodlanmış simvollar. URLDecoder Javadoc-dan:

"Z", "A", "0" - "9" və "-", "_", "." İlə "a" vasitəsilə "a" kodlanmış simli bütün simvollar aşağıdakılardır: həmçinin "*". "%" Xarakterinə icazə verilir, lakin xüsusi qaçış sırasının başlanğıcı kimi şərh edilir.

...

Bu dekoderin qaçaq strings ilə məşğul ola biləcək iki mümkün yolları var. Qeyri-qanuni simvolları yalnız tərk edə bilər və ya bir IllegalArgumentException istisna səbəb ola bilər. Dekoderin hansı yanaşma götürdüyü hələ də tətbiq olunmaqdadır.

Praktikada URLDecoder adətən yuxarıdakı təhlükə kimi IllegalArgumentException . Fayl yolunuzda %20 kimi kodlanmış boşluqlar varsa, bu yanaşma işə yara bilər. Bununla belə, faylın yolunda + digər alfaric olmayan simvollar varsa + , faylın yolunu dəyişməklə URLDecoder ilə probleminiz olacaq.

İş kodu

Bu addımlara nail olmaq üçün aşağıdakı üsullara sahib ola bilərsiniz:

  public static URL getLocation(final Class<?> c) { if (c == null) return null; // could not load the class // try the easy way first try { final URL codeSourceLocation = c.getProtectionDomain().getCodeSource().getLocation(); if (codeSourceLocation != null) return codeSourceLocation; } catch (final SecurityException e) { // NB: Cannot access protection domain. } catch (final NullPointerException e) { // NB: Protection domain or code source is null. } // NB: The easy way failed, so we try the hard way. We ask for the class // itself as a resource, then strip the class path from the URL string, // leaving the base path. // get the class raw resource path final URL classResource = c.getResource(c.getSimpleName() + ".class"); if (classResource == null) return null; // cannot find class resource final String url = classResource.toString(); final String suffix = c.getCanonicalName().replace('.', '/') + ".class"; if (!url.endsWith(suffix)) return null; // weird URL // strip the class path from the URL string final String base = url.substring(0, url.length() - suffix.length()); String path = base; // remove the "jar:" prefix and "!/" suffix, if present if (path.startsWith("jar:")) path = path.substring(4, path.length() - 2); try { return new URL(path); } catch (final MalformedURLException e) { e.printStackTrace(); return null; } }  public static File urlToFile(final URL url) { return url == null ? null : urlToFile(url.toString()); }  public static File urlToFile(final String url) { String path = url; if (path.startsWith("jar:")) { // remove "jar:" prefix and "!/" suffix final int index = path.indexOf("!/"); path = path.substring(4, index); } try { if (PlatformUtils.isWindows()  path.matches("file:[A-Za-z]:.*")) { path = "file:/" + path.substring(5); } return new File(new URL(path).toURI()); } catch (final MalformedURLException e) { // NB: URL is not completely well-formed. } catch (final URISyntaxException e) { // NB: URL is not completely well-formed. } if (path.startsWith("file:")) { // pass through the URL as-is, minus "file:" prefix path = path.substring(5); return new File(path); } throw new IllegalArgumentException("Invalid URL: " + url); } 

Bu üsullar SciJava Common kitabxanasında tapıla bilər:

138
04 окт. cavab 04 oktyabr ctrueden verilir . 2012-10-04 21:08 '12 at 21:08 2012-10-04 21:08

Siz də istifadə edə bilərsiniz:

 CodeSource codeSource = YourMainClass.class.getProtectionDomain().getCodeSource(); File jarFile = new File(codeSource.getLocation().toURI().getPath()); String jarDir = jarFile.getParentFile().getPath(); 
47
15 авг. Benny Neugebauer tərəfindən verilmiş cavab 15 Avqust. 2011-08-15 02:33 '11 saat 02:33 'da 2011-08-15 02:33

Mövcud sinif üçün URL tapmaq üçün ClassLoader.getResource () istifadə edin.

Məsələn:

 package foo; public class Test { public static void main(String[] args) { ClassLoader loader = Test.class.getClassLoader(); System.out.println(loader.getResource("foo/Test.class")); } } 

(Bu nümunə oxşar bir sualdan alınır.)

Bir qovluğu tapmaq üçün əl ilə URL çıxarmaq lazımdır. JarClassLoader təlimatını jar URL formatı üçün baxın.

22
26 нояб. Cavab Jon Skeet tərəfindən noyabrın 26-da verilir 2008-11-26 15:34 '08 at 15:34 2008-11-26 15:34

Path yaxınlarda Path istifadə etməyi təklif etdiyini görməyə təəccübləndim. Aşağıdakı quote: " Path sinifi yol haqqında məlumat əldə etmək, yola çıxma elementləri, yolları digər formalara çevirmək və ya yolun bir hissəsini çıxarmaq üçün istifadə edilə bilən müxtəlif metodlardan ibarətdir".

Beləliklə, yaxşı bir alternativ kimi bir Path obyekti almaqdır:

 Path path = Paths.get(Test.class.getProtectionDomain().getCodeSource().getLocation().toURI()); 
16
28 авг. cavab mat_boy 28 aug. 2013-08-28 11:04 '13 at 11:04 2013-08-28 11:04

Linux, Mac və Windows-da mənim üçün işləyən yeganə həll:

 public static String getJarContainingFolder(Class aclass) throws Exception { CodeSource codeSource = aclass.getProtectionDomain().getCodeSource(); File jarFile; if (codeSource.getLocation() != null) { jarFile = new File(codeSource.getLocation().toURI()); } else { String path = aclass.getResource(aclass.getSimpleName() + ".class").getPath(); String jarFilePath = path.substring(path.indexOf(":") + 1, path.indexOf("!")); jarFilePath = URLDecoder.decode(jarFilePath, "UTF-8"); jarFile = new File(jarFilePath); } return jarFile.getParentFile().getAbsolutePath(); } 
13
20 авг. Avqustun 20-də Dmitri Trofimovun verdiyi cavab 2013-08-20 20:41 '13 at 8:41 pm 2013-08-20 20:41

Mənim də eyni problemim var idi və mən bunu belə həll etdim:

 File currentJavaJarFile = new File(Main.class.getProtectionDomain().getCodeSource().getLocation().getPath()); String currentJavaJarFilePath = currentJavaJarFile.getAbsolutePath(); String currentRootDirectoryPath = currentJavaJarFilePath.replace(currentJavaJarFile.getName(), ""); 

Ümid edirəm sizə kömək edirəm.

7
27 мая '13 в 17:10 2013-05-27 17:10 Cavab Charlie tərəfindən verilir 27, '13 5:10 pm 2013-05-27

Spesifikasiyalarda mənə natamam görünən digər şərhlərə yenilənir.

.jar faylı xaricində nisbi "qovluq" istifadə etmək (bankda eyni yer):

 String path = YourMainClassName.class.getProtectionDomain(). getCodeSource().getLocation().getPath(); path = URLDecoder.decode( path, "UTF-8"); BufferedImage img = ImageIO.read( new File(( new File(path).getParentFile().getPath()) + File.separator + "folder" + File.separator + "yourfile.jpg")); 
7
29 марта '12 в 14:27 2012-03-29 14:27 Cavab 29 Mart 2012-ci il saat 14: 27-də verilir. 2012-03-29 14:27

Jar faylını idarə etmək üçün yol almaq üçün yuxarıda göstərilən həlləri öyrəndim və mövcud olan bütün üsulları özləri arasında olan fərq kimi sınamışam. Bu kod Eclipse IDE-də işlədilirsə, onlar müəyyən bir sinif daxil olmaqla, faylın yolunu tapmalı və aşkar edilmiş yolla müəyyən edilmiş faylları açmalı və yaratmalıdırlar.

Halbuki, jar faylını doğrudan və ya komanda yoluyla başlasanız, bu uğursuz olacaq, çünki yuxarıdakı üsullardan əldə edilən jar fayl yolu jar faylında bir daxili yol verəcəkdir, yəni həmişə yolunu verir

rsrc: layihə adı (ehtimal ki, bu əsas sinif faylının paket adıdır - müəyyən sinif)

Rsrc-i çevirə bilmərəm: ... xarici yola yol, yəni, jar faylını Eclipse IDE-dən kənarlaşdırdığımda, jar faylına gedə bilmərəm.

Eclipse IDE kənarında bir jar faylını açma yolunu əldə etmək mümkündür

 System.getProperty("java.class.path") 

kod xətti java sənədi və bəzi insanlar eyni kataloqdakı bütün sinif faylları qaytaracaqlarını söyləyərək, işçi jar faylının (qayda yolunun işçi qovluğu olmadığını) canlı bir yolunu (fayl adını da daxil) amma testlərimdən sonra, eyni kataloqda çox jar faylları varsa, yalnız jar açma yolunu qaytarır (bir neçə yolla problemlər üçün, həqiqətən, Eclipse-da baş verib).

5
02 нояб. Cavab verildi phchen2 02 noyabr. 2015-11-02 11:13 '15 at 11:13 2015-11-02 11:13

Gnome masa üstü mühitindən (hər hansı bir skriptdən və ya terminaldan deyil) üzərinə tıklayaraq bir kavanoza başlamaqla yuxarıdakı seçilmiş cavab işləmir.

Bunun əvəzinə, mən dünyanın hər yerində aşağıdakı həlli ilə maraqlanıram:

  try { return URLDecoder.decode(ClassLoader.getSystemClassLoader().getResource(".").getPath(), "UTF-8"); } catch (UnsupportedEncodingException e) { return ""; } 
4
28 сент. Cavab lviggiani tərəfindən verilir Sep 28 2011-09-28 10:26 '11 saat 10:26 'da 2011-09-28 10:26

Nəhayət bir iş (və qısa) həlli tapmadan əvvəl bir çox ətrafında qarışdırmaq məcburiyyətində qaldım.
jarLocation tipi file:\ prefiksi ilə gəlir file:\ və ya jar:file\ , String#substring() istifadə edərək silinəcəkdir.

 URL jarLocationUrl = MyClass.class.getProtectionDomain().getCodeSource().getLocation(); String jarLocation = new File(jarLocationUrl.toString()).getParent(); 
3
30 авг. Cavab 30 Avqust Jelle tərəfindən verilir 2016-08-30 16:58 '16 'da 4:58 pm 2016-08-30 16:58' da

Əslində, bu ən yaxşı versiya - köhnə uğursuzluq, əgər qovluqda bir yer olsaydı.

  private String getJarFolder() { // get name and path String name = getClass().getName().replace('.', '/'); name = getClass().getResource("/" + name + ".class").toString(); // remove junk name = name.substring(0, name.indexOf(".jar")); name = name.substring(name.lastIndexOf(':')-1, name.lastIndexOf('/')+1).replace('%', ' '); // remove escape characters String s = ""; for (int k=0; k<name.length(); k++) { s += name.charAt(k); if (name.charAt(k) == ' ') k += 2; } // replace '/' with system separator char return s.replace('/', File.separatorChar); } 

Apletləri rədd etmək üçün, adətən yerli fayllara giriş yoxdur. JWS haqqında çox şey bilmirəm, ancaq yerli faylları idarə etmək üçün ərizə yükləmək mümkün olmaya bilər.

3
15 апр. cavab bacup uşaq 15 apr verilir. 2011-04-15 17:30 '11 saat 17: 30-da 2011-04-15 17:30

Digər cavablar, kodu deyil, Jar faylının yeri olan bir kataloq deyil, kodun mənbəyini göstərir.

İstifadə

 return new File(MyClass.class.getProtectionDomain().getCodeSource().getLocation().toURI().getPath()).getParentFile(); 
3
10 июня '16 в 14:57 2016-06-10 14:57 cavab 10 iyun 'da 14:57' də verilir. 2016-06-10 14:57

Ən sadə həlli, kavanozun başlanğıcında yolun bir arqument kimi keçirilməsidir.

Bunu skript kabuğunda (Windows-da, .sh başqa yerdə) avtomatlaşdıra bilərsiniz:

 java -jar my-jar.jar . 

Mən də istifadə etdim . mövcud işçi qovluğunu köçürmək.

ƏLAVƏ OLUNUB

JAR faylını bir alt qovluqda yerləşdirmək istəməli, belə ki istifadəçilər təsadüfən basın. Kodunuz, komut satırı argümanlarının sağlandığından əmin olmaq və arqumentlər olmadıqda yaxşı bir səhv mesajı təmin etməlidir.

3
20 окт. Max Heiber tərəfindən verilən cavab 20 oktadır. 2015-10-20 19:57 '15 at 19:57 2015-10-20 19:57

Istifadə edərək jar istifadə etmək üçün cəhd

 String folder = MyClassName.class.getProtectionDomain().getCodeSource().getLocation().getPath(); 

c: \ app> java -jar tətbiqi

"C: \ app" qovluğunda, Windows'da "application.jar" adlı jar proqramını işləyərkən, dəyişən "String" dəyəri "\ c: \ app \ application.jar" idi və mən düzgün yol

 File test = new File(folder); if(file.isDirectory()  file.canRead()) { //always false } 

Beləliklə, "testi" kimi müəyyən etməyə çalışdım:

 String fold= new File(folder).getParentFile().getPath() File test = new File(fold); 

yolun düzgün formatda, məsələn, "c: \ app" yerinə "\ c: \ app \ application.jar" yerinə yetirmək üçün işlədiyini fərq etdim.

2
21 февр. TheGreatPsychoticBunny tərəfindən verilmiş cavab 21 fevral. 2014-02-21 18:23 '14 at 18:23 2014-02-21 18:23
 public static String dir() throws URISyntaxException { URI path=Main.class.getProtectionDomain().getCodeSource().getLocation().toURI(); String name= Main.class.getPackage().getName()+".jar"; String path2 = path.getRawPath(); path2=path2.substring(1); if (path2.contains(".jar")) { path2=path2.replace(name, ""); } return path2;} 

Windows-da yaxşı işləyir

2
05 апр. Cavab Denton tərəfindən verilib 05 Aprel. 2013-04-05 13:09 '13 at 13:09 2013-04-05 13:09
 String path = getClass().getResource("").getPath(); 

Yol həmişə jar faylına aiddir.

2
16 нояб. Cavab ZZZ 16 noyabrda verilir. 2010-11-16 00:40 '10 'da 0:40' da 2010-11-16 00:40

Başqaları haqqında kifayət qədər əmin deyiləm, amma mənim vəziyyətimdə "Runnable jar" ilə işləməmişdim və kodları phchen2 cavabı ilə birlikdə düzəldirdim və bu linkdən başqa bir: JAR faylını necə işləyən yolu əldə etmək olar? Kod:

  String path=new java.io.File(Server.class.getProtectionDomain() .getCodeSource() .getLocation() .getPath()) .getAbsolutePath(); path=path.substring(0, path.lastIndexOf(".")); path=path+System.getProperty("java.class.path"); 
1
21 июня '16 в 18:57 2016-06-21 18:57 Cavab Fahad Alkamlı tərəfindən 21 İyun, 18:57, 2016-06-21 18:57

MyClass.class.getProtectionDomain().getCodeSource().getLocation() bir şey yox ki, Eclipse, MyClass.class.getProtectionDomain().getCodeSource().getLocation() inkişaf edərkən MyClass.class.getProtectionDomain().getCodeSource().getLocation() , böyük olan /bin qaytarır, lakin bir MyClass.class.getProtectionDomain().getCodeSource().getLocation() , yol Qeyri-qanuni fayl adlarını verən öz-özlüyündə / /myjarname.jar .

Kod həm idedə, həm də bir banka tərtib etdikdən sonra işləmək üçün aşağıdakı kod parçasını istifadə edirəm:

 URL applicationRootPathURL = getClass().getProtectionDomain().getCodeSource().getLocation(); File applicationRootPath = new File(applicationRootPathURL.getPath()); File myFile; if(applicationRootPath.isDirectory()){ myFile = new File(applicationRootPath, "filename"); } else{ myFile = new File(applicationRootPath.getParentFile(), "filename"); } 
1
14 дек. Cavab Aleksandr 14 dekabr. 2015-12-14 09:34 '15 at 09:34 2015-12-14 09:34

Arxivdəki koddan çağırılan bu üsul, .jar faylının yerləşdiyi qovluğu qaytarır. Windows ya da Unix-də işləməlidir.

 private String getJarFolder() { String name = this.getClass().getName().replace('.', '/'); String s = this.getClass().getResource("/" + name + ".class").toString(); s = s.replace('/', File.separatorChar); s = s.substring(0, s.indexOf(".jar")+4); s = s.substring(s.lastIndexOf(':')-1); return s.substring(0, s.lastIndexOf(File.separatorChar)+1); } 

Koddan hazırlanır: JAR-ın işləməyini müəyyənləşdirin

0
14 апр. Cavab Bacup Lad 14 apr verilir. 2011-04-14 21:09 '11 at 21:09 2011-04-14 21:09

Bu kod mənim üçün çalışdı:

 private static String getJarPath() throws IOException, URISyntaxException { File f = new File(LicensingApp.class.getProtectionDomain().().getLocation().toURI()); String jarPath = f.getCanonicalPath().toString(); String jarDir = jarPath.substring( 0, jarPath.lastIndexOf( File.separator )); return jarDir; } 
0
08 сент. John Lockwood tərəfindən verilmiş cavab Sep 08 2017-09-08 14:58 '17 at 2:58 pm 2017-09-08 14:58

Banka işlədiyi halda, banka gedən yolu aşağıdakı kodu istifadə etməklə əldə edilə bilər:

 public class JarpathTest { public static void main(String[] args) { File jarDir = new File(ClassLoader.getSystemClassLoader().getResource(".").getPath()); System.out.println(jarDir.getAbsolutePath()); } } 
0
21 дек. Abhishek Tiwari tərəfindən verilmiş cavab 21 dekabr 2018-12-21 13:57 '18 də 13:57 2018-12-21 13:57

Yalnız Windows yoxlanıldığını xatırladın, amma hesab edirəm ki, digər əməliyyat sistemlərində ( Linux,MacOs,Solaris ) :) yaxşı işləyir.


Eyni .jar 2 .jar var idi. Eyni .jar eyni .jar faylından başqa bir .jar faylı çalıştırmak istedim.

Problem cmd mövcud system32 qovluğundan işləyərkən.


xəbərdarlıq!

  • Aşağıda göstərir ki, hər hansı bir qovluq adı ilə etdiyim bütün testlərdə də hər şey yaxşıdır ;][[;'57f2g34g87-8+9-09!2#@!$%^^> və ya ()%> yaxşı işləyir.
  • ProcessBuilder aşağıdakı kimi istifadə edirəm:

🍂 ..

 //The class from which i called this was the class `Main` String path = getBasePathForClass(Main.class); String applicationPath= new File(path + "application.jar").getAbsolutePath(); System.out.println("Directory Path is : "+applicationPath); //Your know try catch here //Mention that sometimes it doesn't work for example with folder `;][[;'57f2g34g87-8+9-09!2#@!$%^^ ProcessBuilder builder = new ProcessBuilder("java", "-jar", applicationPath); builder.redirectErrorStream(true); Process process = builder.start(); //...code 

🍂 getBasePathForClass(Class<?> classs) :

   public static final String getBasePathForClass(Class<?> classs) { // Local variables File file; String basePath = ""; boolean failed = false; // Let give a first try try { file = new File(classs.getProtectionDomain().getCodeSource().getLocation().toURI().getPath()); if (file.isFile() || file.getPath().endsWith(".jar") || file.getPath().endsWith(".zip")) { basePath = file.getParent(); } else { basePath = file.getPath(); } } catch (URISyntaxException ex) { failed = true; Logger.getLogger(classs.getName()).log(Level.WARNING, "Cannot firgue out base path for class with way (1): ", ex); } // The above failed? if (failed) { try { file = new File(classs.getClassLoader().getResource("").toURI().getPath()); basePath = file.getAbsolutePath(); // the below is for testing purposes... // starts with File.separator? // String l = local.replaceFirst("[" + File.separator + // "/\\\\]", "") } catch (URISyntaxException ex) { Logger.getLogger(classs.getName()).log(Level.WARNING, "Cannot firgue out base path for class with way (2): ", ex); } } // fix to run inside eclipse if (basePath.endsWith(File.separator + "lib") || basePath.endsWith(File.separator + "bin") || basePath.endsWith("bin" + File.separator) || basePath.endsWith("lib" + File.separator)) { basePath = basePath.substring(0, basePath.length() - 4); } // fix to run inside netbeans if (basePath.endsWith(File.separator + "build" + File.separator + "classes")) { basePath = basePath.substring(0, basePath.length() - 14); } // end fix if (!basePath.endsWith(File.separator)) { basePath = basePath + File.separator; } return basePath; } 
0
19 мая '17 в 16:12 2017-05-19 16:12 Cavab GOXR3PLUS 19 may 17: 16-da verilir 2017-05-19 16:12

Və ya cari axından bu şəkildə keçə bilərsiniz:

 String myPath = Thread.currentThread().getContextClassLoader().getResource("filename").getPath(); 
-1
23 сент. Cavab Assem BARDI tərəfindən verilir . 2015-09-23 15:38 '15 'də 15:38' də 2015-09-23 15:38

Java 7-də yazılıyam və Windows 7-də Oracle yürütülebilir mühitlə və Ubuntu-u açıq mənbə ilə test edirəm. Bu, bu sistemlər üçün idealdır:

Hər hansı bir çalışan jar faylının (əgər bu kodu çağırdığınız sinif bankın özünün birbaşa uşaqıdırsa) ana kataloquna yol:

 try { fooDir = new File(this.getClass().getClassLoader().getResource("").toURI()); } catch (URISyntaxException e) { //may be sloppy, but don't really need anything here } fooDirPath = fooDir.toString(); // converts abstract (absolute) path to a String 

Belə ki, foo.jar yolu aşağıdakı kimi olacaq:

 fooPath = fooDirPath + File.separator + "foo.jar"; 

Yenə Mac və ya köhnə Windows-da test edilmədi.

-1
04 марта '14 в 2:54 2014-03-04 02:54 cavab 04 mart '14 'də saat 2:54' də verildi

String sinifinin yerini almaq üçün başqa yolum var.

 URL path = Thread.currentThread().getContextClassLoader().getResource(""); Path p = Paths.get(path.toURI()); String location = p.toString(); 

Çıxış xətti olacaq

 C:\Users\Administrator\new Workspace\... 

Boşluqlar və digər simvollar şəklində olmayan formada file:/ . Belə ki, istifadə etmək daha asan olacaq.

-1
21 мая '15 в 21:41 2015-05-21 21:41 cavab 21 may, 21: 21-da 21 may 2015 -ci ildə verilir

getProtectionDomain yanaşma, məsələn, işləməyəcək. bəzi əsas Java dərsləri üçün bir qayda tapmaq lazımdır (məsələn, mənim halda IBM JDK-da StringBuilder sinifində), lakin planları izləyin:

 public static void main(String[] args) { System.out.println(findSource(MyClass.class)); // OR System.out.println(findSource(String.class)); } public static String findSource(Class<?> clazz) { String resourceToSearch = '/' + clazz.getName().replace(".", "/") + ".class"; java.net.URL location = clazz.getResource(resourceToSearch); String sourcePath = location.getPath(); // Optional, Remove junk return sourcePath.replace("file:", "").replace("!" + resourceToSearch, ""); } 
-1
14 мая '15 в 21:02 2015-05-14 21:02 Cavab verilir Vasu 14 may, '15 'da 21:02 2015-05-14 21:02

Yedək köməkçisinin cavabı nəzərə alınmır, normal görünür, ancaq bir neçə problem var:

Burada hər ikisi +1 olmalı -1:

 name = name.substring(name.lastIndexOf(':')-1, name.lastIndexOf('/')+1).replace('%', ' '); 

Çox təhlükəlidir, çünki yolda boşluq yoxdur, ancaq yalnız "%" əvəz olunarsa, hər bir məkanda 20 ədəd bir dəstə tərk edəcəkdir:

 name = name.substring(name.lastIndexOf(':')-1, name.lastIndexOf('/')+1).replace('%', ' '); 

Boşluqlar üçün bu loopdan daha səmərəli yollar var.

Bu da diskussiya zamanı problem yaradır.

-1
28 апр. Cavab rciafardone 28 apr tərəfindən verilir . 2011-04-28 04:51 '11 at 4:51 2011-04-28 04:51

Bu liner boşluq və ya xüsusi simvol olan qovluqlar üçün işləyir (məsələn, ç və ya õ). Orijinal sual, JAR faylının özü olmadan mütləq yolunu (iş qovluğu) təyin edir. Windows7-də Java7 istifadə edərək test edilmişdir:

 String workingDir = System.getProperty("user.dir"); 

Link: http://www.mkyong.com/java/how-to-get-the-current-working-directory-in-java/

-2
16 апр. Rodrigo N. Hernandez tərəfindən 16 apreldə cavab verildi. 2015-04-16 23:37 '15 at 23:37 2015-04-16 23:37
  • 1
  • 2

etiketləri ilə digər suallar və ya bir sual