كيفية تعيين مسار فئة Java طويل في نظام التشغيل Windows؟

StackOverflow https://stackoverflow.com/questions/201816

  •  03-07-2019
  •  | 
  •  

سؤال

أحاول إجراء اختبار JUnit معين يدويًا على سطر أوامر نظام التشغيل Windows XP، والذي يحتوي على عدد كبير بشكل غير عادي من العناصر في مسار الفئة.لقد قمت بتجربة عدة أشكال مثل:

set CLASS_PATH=C:\path\a\b\c;C:\path\e\f\g;....
set CLASS_PATH=%CLASS_PATH%;C:\path2\a\b\c;C:\path2\e\f\g;....
...
C:\apps\jdk1.6.0_07\bin\java.exe -client oracle.jdevimpl.junit.runner.TestRunner com.myco.myClass.MyTest testMethod

(تقوم الاختلافات الأخرى بتعيين مسار الفصل على سطر واحد، وتعيين مسار الفصل عبر -classpath كوسيطة لـ java").يتعلق الأمر دائمًا بوحدة التحكم التي ترفع يديها مع هذا الخطأ:

The input line is too long.
The syntax of the command is incorrect.

هذا اختبار JUnit يختبر مشروعًا قديمًا كبيرًا إلى حد ما، لذلك لا توجد اقتراحات حول إعادة ترتيب بنية الدليل الخاص بي إلى شيء أكثر منطقية، فهذه الأنواع من الحلول مطروحة حاليًا.كنت أحاول فقط إنشاء اختبار سريع لهذا المشروع وتشغيله على سطر الأوامر، ووحدة التحكم تمنعني.يساعد!

هل كانت مفيدة؟

المحلول

وسطر الأوامر ويندوز يحد جدا في هذا الصدد. والحل هو إنشاء "جرة تحديد المسارات". هذا هو وعاء يحتوي فقط ملف Manifest.mf، الذي يحدد مسارات القرص من قائمتك طويلة من الجرار Class-Path، وما إلى ذلك الآن فقط إضافة هذا <م> تحديد المسارات جرة إلى CLASSPATH سطر الأوامر الخاص بك. هذا هو عادة ما تكون أكثر ملاءمة من التعبئة والتغليف الموارد الفعلية معا.

وعلى ما أذكر، ويمكن للمسارات القرص يكون نسبة إلى <م> تحديد المسارات جرة نفسها. لذلك Manifest.mf قد تبدو شيئا من هذا القبيل:

Class-Path: this.jar that.jar ../lib/other.jar

وإذا كان لديك <م> تحديد المسارات جرة يحتوي أساسا الموارد الأساسية، ثم انها لن تغير كثيرا جدا، ولكن هل من المحتمل أن لا تزال تريد أن تولد في مكان ما في الإنشاء. على سبيل المثال:

<jar destfile="pathing.jar">
  <manifest>
    <attribute name="Class-Path" value="this.jar that.jar ../lib/other.jar"/>
  </manifest>
</jar>

نصائح أخرى

منذ Java 6 يمكنك استخدام أحرف البدل لمسار الفئة.

مثال: foo/*, يشير إلى جميع ملفات .jar الموجودة في الدليل foo

  • لن يتطابق هذا مع ملفات الفئة (ملفات jar فقط).لتتناسب مع كلا الاستخدام: foo;foo/* أو foo/*;foo.يحدد الترتيب ما يتم تحميله أولاً.
  • البحث ليس عوديا

استخدم "ملف الوسيطة" في Java 9+

في Java 9+، يدعم ملف Java القابل للتنفيذ توفير الوسائط عبر ملف.يرىhttps://docs.Oracle.com/javase/9/tools/java.htm#JSWOR-GUID-4856361B-8BFD-4964-AE84-121F5F6CF111.

تهدف هذه الآلية بشكل صريح إلى حل مشكلة قيود نظام التشغيل على أطوال الأوامر:

يمكنك تقصير أو تبسيط أمر Java باستخدام ملفات Argument لتحديد ملف نصي يحتوي على وسيط ، مثل الخيارات وأسماء الفصول الدراسية ، التي تم نقلها إلى أمر Java. هذا يتيح لك إنشاء أوامر Java من أي طول على أي نظام تشغيل.

في سطر الأوامر ، استخدم بادئة AT Sign (@) لتحديد ملف وسيطة يحتوي على خيارات Java وأسماء الفصول.عندما يواجه أمر Java ملفًا يبدأ بـ AT Sign (@) ، فإنه يوسع محتويات هذا الملف إلى قائمة وسيطة تمامًا كما سيتم تحديده في سطر الأوامر.

هذا هو الحل "الصحيح" إذا كنت تستخدم الإصدار 9 أو أعلى.تقوم هذه الآلية ببساطة بتعديل كيفية تقديم الوسيطة إلى JVM، و وبالتالي فهو متوافق بنسبة 100% مع أي إطار عمل أو تطبيق, ، بغض النظر عن كيفية قيامهم بتحميل الفصل الدراسي، على سبيل المثال.إنه يعادل تمامًا تقديم الوسيطة في سطر الأوامر كالمعتاد.لا ينطبق هذا على الحلول المستندة إلى البيان لقيود نظام التشغيل هذه.

مثال على ذلك هو:

الأمر الأصلي:

java -cp c:\foo\bar.jar;c:\foo\baz.jar

يمكن إعادة كتابتها على النحو التالي:

java @c:\path\to\cparg

أين c:\path\to\cparg هو ملف يحتوي على:

-cp c:\foo\bar.jar;c:\foo\baz.jar

يدعم "ملف الوسيطة" هذا أيضًا أحرف استمرار السطر والاقتباس للتعامل بشكل صحيح مع المسافات في المسارات على سبيل المثال.

-cp "\
c:\foo\bar.jar;\
c:\foo\baz.jar"

جرادل

إذا كنت تواجه هذه المشكلة في Gradle، فاطلع على هذا المكون الإضافي، الذي يحول مسار الفصل الخاص بك تلقائيًا إلى "ملف وسيطة" ويوفر ذلك إلى JVM عند القيام بمهام exec أو اختبار على Windows.في Linux أو أنظمة التشغيل الأخرى، لا يفعل أي شيء بشكل افتراضي، على الرغم من أنه يمكن استخدام قيمة التكوين الاختيارية لتطبيق التحويل بغض النظر عن نظام التشغيل.

https://github.com/redocksoft/classpath-to-file-gradle-plugin

(تنصل:أنا المؤلف)

راجع أيضًا مشكلة Gradle ذات الصلة - ونأمل أن يتم دمج هذه الإمكانية في النهاية في Gradle core: https://github.com/gradle/gradle/issues/1989.

(أفترض أنك لا يعني حقا DOS، ولكن الرجوع إلى CMD.EXE).

وأعتقد أنه من أقل الحد CLASSPATH من حجم بيئة بيئة الحد / حجم متغير. ويندوز إكس بي، يمكن متغيرات البيئة الفردية يكون 8K في الحجم، ويقتصر بيئة بأكمله إلى 64K. لا استطيع ان ارى لك أن تصل إلى هذا الحد.

وهناك حد على النوافذ التي تحد من طول سطر الأوامر، على WindowsNT + هو 8K لCMD.EXE. أمر مجموعة يخضع لهذا التقييد. يمكن أن يكون لديك أكثر من يستحق 8K من الدلائل في قيادة مجموعة الخاصة بك؟ قد يكون من الحظ، ثم - حتى لو كنت تقسيمها مثل <وأ href = "https://stackoverflow.com/questions/201816/how-to-set-a-long-java-classpath-in-msdoswindows # 201857 "> ونيك بيراردي المقترحة.

إذا كنت في حذائك، وأود أن تحميل الأداة المساعدة تقاطع من MS: <لأ href = "http://technet.microsoft.com/en-us/sysinternals/bb896768.aspx" يختلط = "نوفولو noreferrer" > http://technet.microsoft.com/en-us/sysinternals/bb896768.aspx ومن ثم تعيين الخاص بك "C: \ مسار" ليقول "ض: \" و "ج: \ path2" ليقول "ص: \". بهذه الطريقة، وسوف يكون الحد 4 حروف لكل بند في classpath الخاص بك.

set CLASS_PATH=C:\path\a\b\c;C:\path\e\f\g;
set CLASS_PATH=%CLASS_PATH%;C:\path2\a\b\c;C:\path2\e\f\g;

والآن، CLASSPATH الخاص بك وسوف يكون:

set CLASS_PATH=z\a\b\c;z\e\f\g;
set CLASS_PATH=%CLASS_PATH%;y:\a\b\c;y:\e\f\g;

وقد تفعل أكثر اعتمادا على classpath الفعلية الخاصة بك.

وأعتقد أنك تصل الخور بدون مجداف هنا. وفلكس لديه الحد الأقصى للحجج للدعوة الى برمجة.

ولقد 2 sugestion قد تتمكن من محاولة. أولا، قبل تشغيل JUnit الاختبارات، يمكنك أن تدع السيناريو / ant_task إنشاء الجرار من مختلف الطبقات على CLASSPATH. ثم يمكنك وضع الجرار على CLASSPATH، التي ينبغي أن تكون أقصر.

وهناك طريقة أخرى قد تتمكن من محاولة لخلق antscript لتشغيل أداة JUnit، في ANT لا ينبغي أن يكون هناك مثل هذا الحد لإدخالات CLASSPATH.

وكما يذكر HuibertGill، وأود أن الانتهاء من هذه في برنامج نصي بناء Ant مجرد أن ذلك لم يكن لديك لإدارة كل هذا بنفسك.

هل يمكن أن تحاول هذه


@echo off
set A=D:\jdk1.6.0_23\bin
set B=C:\Documents and Settings\674205\Desktop\JavaProj
set PATH="%PATH%;%A%;"
set CLASSPATH="%CLASSPATH%;%B%;"

وانتقل إلى موجه الأوامر وتشغيل مرتين (أي فكرة لماذا .... لا بد لي من القيام بذلك على جهاز ويندوز XP) أيضا مسارات ص فقط تعيين للدورة موجه الأوامر الحالي

ولم يكن هناك حل للقضية أخرى من صنع بطريقة أو بأخرى CLASSPATH أقصر طريق تحريك ملفات جرة في مجلد مثل. "C: \ الجرار"

شكرا ل رامان لتقديم حل جديد لمشكلة المسار لـ Java 9+.لقد قمت بالاختراق ل bootRun المهمة التي تسمح باستخدام كل ما تم تقييمه بالفعل بواسطة gradle لتشغيل Java مع ملفات الوسائط.ليست أنيقة للغاية ولكنها تعمل.

// Fix long path problem on Windows by utilizing java Command-Line Argument Files 
// https://docs.oracle.com/javase/9/tools/java.htm#JSWOR-GUID-4856361B-8BFD-4964-AE84-121F5F6CF111 
// The task creates the command-line argument file with classpath
// Then we specify the args parameter with path to command-line argument file and main class
// Then we clear classpath and main parameters
// As arguments are applied after applying classpath and main class last step 
// is done to cheat gradle plugin: we will skip classpath and main and manually
// apply them through args
// Hopefully at some point gradle will do this automatically 
// https://github.com/gradle/gradle/issues/1989 

if (Os.isFamily(Os.FAMILY_WINDOWS)) {
    bootRun {
        doFirst {
            def argumentFilePath = "build/javaArguments.txt"
            def argumentFile = project.file(argumentFilePath)
            def writer = argumentFile.newPrintWriter()
            writer.print('-cp ')
            writer.println(classpath.join(';'))
            writer.close()

            args = ["@${argumentFile.absolutePath}", main]
            classpath = project.files()
            main = ''
        }
    }
}

هل حاولت التراص لهم؟

set CLASS_PATH = c:\path
set ALT_A = %CLASS_PATH%\a\b\c;
set ALT_B = %CLASS_PATH%\e\f\g;
...

set ALL_PATHS = %CLASS_PATH%;%ALT_A%;%ALT_B%
مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top