2013-07-24 120 views
18

Gần đây tôi đã thử thay đổi các biến môi trường của mình để đặt đường dẫn thành javac.exe (trong số các thứ khác). Nó đã làm việc tốt cho đến khi, tất cả của một bất ngờ, tôi bắt đầu nhận được lỗi này. Ví dụ, tôi tuyên bố một biến JAVA_HOME được'C: Program' không được nhận dạng lỗi

C:\Program Files\Java\jdk1.7.0_25

Sau đó, tôi thêm

%JAVA_HOME%\bin

vào biến PATH, nhưng điều này mang lại cho tôi một lỗi:

'C:\Program' is not recognized as an internal or external command, operable command or batch file.

Lỗi này làm cho nó có vẻ như nó đang chạy vào các vấn đề với không gian trong "Program Files". Điều này là lạ, mặc dù, vì nó đã không được làm điều này trong một thời gian tốt, sau đó bắt đầu. Hơn nữa, có các biến khác với khoảng trống trong chúng hoạt động tốt. Tôi đã thử xóa biến và tạo lại biến đó, đặt dấu ngoặc kép xung quanh JAVA_HOME (đi đúng đường dẫn, nhưng không tìm thấy chính xác javac.exe) ..

Bất kỳ mẹo nào về những gì tôi có thể làm?

Đây là trên Windows 7.

EDIT:

Các biến môi trường đã được thiết lập bằng cách vào Control Panel> Advanced System Settings> Environment Variables. Giá trị của các biến được thiết lập bằng cách sao chép địa chỉ của thư mục mà tôi muốn thông qua một cửa sổ Explorer. Tôi đã thêm nó vào biến môi trường PATH bằng cách thêm địa chỉ với một không gian giữa các biến trước và một dấu chấm phẩy ở cuối, như vậy:

C:\Users\Demo_User_1\AppData\Roaming\npm; %JAVA_HOME%

nơi biến JAVA_HOME được định nghĩa như vậy:

C:\Program Files\Java\jdk1.7.0_25

tôi kiểm tra giá trị của biến thông qua một cửa sổ lệnh bằng cách gõ% JAVA_HOME%, và đó là nơi tôi nhận được lỗi kết quả của " 'C: \ Program' không được công nhận ..."

Kết quả của 'bộ' như sau:

C:\Users\Demo_User_1>set 
ALLUSERSPROFILE=C:\ProgramData 
ANDROID_HOME=C:\Users\Demo_User_1\Desktop\Android\adt-bundle-windows-x86_64-2013 
0717\sdk 
APPDATA=C:\Users\Demo_User_1\AppData\Roaming 
CommonProgramFiles=C:\Program Files\Common Files 
CommonProgramFiles(x86)=C:\Program Files (x86)\Common Files 
CommonProgramW6432=C:\Program Files\Common Files 
COMPUTERNAME=DEMO_USER_1-HP 
ComSpec=C:\Windows\system32\cmd.exe 
FP_NO_HOST_CHECK=NO 
HOMEDRIVE=C: 
HOMEPATH=\Users\Demo_User_1 
JAVA_HOME=C:\Program Files\Java\jdk1.7.0_25 
LOCALAPPDATA=C:\Users\Demo_User_1\AppData\Local 
LOGONSERVER=\\DEMO_USER_1-HP 
NUMBER_OF_PROCESSORS=4 
OnlineServices=Online Services 
OS=Windows_NT 
Path=C:\Program Files (x86)\Intel\iCLS Client\;C:\Program Files\Intel\iCLS Clien 
t\;C:\Program Files\Common Files\Microsoft Shared\Windows Live;C:\Program Files 
(x86)\Common Files\Microsoft Shared\Windows Live;C:\Windows\system32;C:\Windows; 
C:\Windows\System32\Wbem;C:\Windows\System32\WindowsPowerShell\v1.0\;C:\Program 
Files (x86)\Windows Live\Shared;C:\Program Files (x86)\Intel\OpenCL SDK\2.0\bin\ 
x86;C:\Program Files (x86)\Intel\OpenCL SDK\2.0\bin\x64;C:\Program Files\Intel\I 
ntel(R) Management Engine Components\DAL;C:\Program Files\Intel\Intel(R) Managem 
ent Engine Components\IPT;C:\Program Files (x86)\Intel\Intel(R) Management Engin 
e Components\DAL;C:\Program Files (x86)\Intel\Intel(R) Management Engine Compone 
nts\IPT;C:\Program Files\Intel\WiFi\bin\;C:\Program Files\Common Files\Intel\Wir 
elessCommon\;C:\Program Files\Microsoft\Web Platform Installer\;C:\Program Files 
(x86)\Microsoft ASP.NET\ASP.NET Web Pages\v1.0\;C:\Program Files (x86)\Windows 
Kits\8.0\Windows Performance Toolkit\;C:\Program Files\Microsoft SQL Server\110\ 
Tools\Binn\;C:\Program Files\nodejs\; C:\Users\Demo_User_1\Desktop\Android\adt-b 
undle-windows-x86_64-20130717\sdk/platform-tools; C:\Users\Demo_User_1\Desktop\A 
ndroid\adt-bundle-windows-x86_64-20130717\sdk\tools; %JAVA_HOME%; %ANT_HOME%/bin 
; C:\Program Files\Java\jdk1.7.0_25\bin; C:\Users\Demo_User_1\AppData\Roaming\np 
m; "%JAVA_HOME%"; ;C:\Users\Demo_User_1\Desktop\Android\adt-bundle-windows-x86_6 
4-20130717\sdk/tools; C:\Users\Demo_User_1\Desktop\Android\adt-bundle-windows-x8 
6_64-20130717\sdk/platform-tools 
PATHEXT=.COM;.EXE;.BAT;.CMD;.VBS;.VBE;.JS;.JSE;.WSF;.WSH;.MSC 
PCBRAND=Pavilion 
Platform=MCD 
PROCESSOR_ARCHITECTURE=AMD64 
PROCESSOR_IDENTIFIER=Intel64 Family 6 Model 58 Stepping 9, GenuineIntel 
PROCESSOR_LEVEL=6 
PROCESSOR_REVISION=3a09 
ProgramData=C:\ProgramData 
ProgramFiles=C:\Program Files 
ProgramFiles(x86)=C:\Program Files (x86) 
ProgramW6432=C:\Program Files 
PROMPT=$P$G 
PSModulePath=C:\Windows\system32\WindowsPowerShell\v1.0\Modules\ 
PUBLIC=C:\Users\Public 
SESSIONNAME=Console 
SystemDrive=C: 
SystemRoot=C:\Windows 
TEMP=C:\Users\DEMO_U~1\AppData\Local\Temp 
TMP=C:\Users\DEMO_U~1\AppData\Local\Temp 
USERDOMAIN=Demo_User_1-HP 
USERNAME=Demo_User_1 
USERPROFILE=C:\Users\Demo_User_1 
VS110COMNTOOLS=C:\Program Files (x86)\Microsoft Visual Studio 11.0\Common7\Tools 
\ 
windir=C:\Windows 
windows_tracing_flags=3 
windows_tracing_logfile=C:\BVTBin\Tests\installpackage\csilogfile.log 
+0

Vui lòng cụ thể hơn/chi tiết hơn. Bạn đã đặt biến như thế nào? Làm thế nào bạn thêm nó vào đường dẫn? Khi nào/nơi nào bạn nhận được lỗi? Ngoài ra, nó sẽ giúp nếu bạn đăng danh sách các biến môi trường (gõ 'set' tại dấu nhắc ** cmd ** và sao chép kết quả). –

+0

Câu hỏi của bạn đã được trả lời trong bản chỉnh sửa. Cảm ơn! – derekahc

Trả lời

20

Được rồi, điều đó làm cho nó rõ ràng hơn.

Có hai vấn đề chính ở đây.

Trước hết, lý do bạn nhận được 'C:\Program' is not recognized... là, tất nhiên, bởi vì nó chứa dấu cách. Thực tế là bạn có nó được trích dẫn trong biến môi trường PATH không có liên quan đến cách % JAVA_HOME% được diễn giải tại dấu nhắc. Bạn có hai lựa chọn.

  1. Trích nó khi bạn xác định các biến, ví dụ: thiết lập JAVA_HOME-"C:\Program Files\Java\jdk1.7.0_25"
  2. Trích nó khi bạn gọi nó. Nhập "%JAVA_HOME%\bin" tại dấu nhắc. Tất nhiên, bạn sẽ nhận được lỗi "không được nhận dạng là lệnh nội bộ hoặc bên ngoài, tệp chương trình có thể hoạt động hoặc tệp hàng loạt" trừ khi bạn kết thúc đường dẫn có tệp thi hành (ví dụ:"%JAVA_HOME%\bin\javac.exe"), nhưng bạn sẽ thấy rằng cách này nó than phiền về '"C: \ Program Files \ Java \ jdk1.7.0_25"' thay vì 'C: \ Program'.

Thứ hai, bạn không thể sử dụng biến môi trường trong đường dẫn. Bạn có thể sử dụng biến môi trường khi bạn đặt đường dẫn tại dấu nhắc lệnh. Ví dụ,

set PATH=%PATH%;%JAVA_HOME% 

sẽ làm việc, nhưng đó là bởi vì % JAVA_HOME% được mở rộng tại cửa sổ dòng lệnh và PATH được thiết lập để kết quả. Nếu bạn kiểm tra giá trị của PATH, bạn sẽ thấy rằng kết thúc bằng C: \ Program Files \ Java \ jdk1.7.0_25, không phải % JAVA_HOME%.

Ngoài ra, nếu javac.exe là trong bin thư mục con, bạn sẽ cần phải làm việc này trong đường dẫn, ví dụ: thêm ;C:\Program Files\Java\jdk1.7.0_25\bin đến con đường.

(BTW, bạn có % JAVA_HOME% trong đường dẫn hai lần, và có một dấu chấm phẩy thêm sau một giây.)

+1

Tại sao bạn có một 'ở cuối đoạn mã thứ hai đến đoạn cuối? –

+1

@kayleeFrye_onDeck Trông giống như lỗi chỉnh sửa. Tôi có lẽ ban đầu đã có nó như là một khoảng mã nội tuyến, sau đó thay đổi nó thành một khối thụt lề và quên để xóa backtick đóng cửa. Tôi đã xóa nó. –

1

Mặc dù Adi Inbar là khá rõ ràng về vấn đề này, tôi nghĩ rằng isn workaround mình không phải là giải pháp tốt nhất, bởi vì nó cố gắng để vá xung quanh vấn đề ban đầu: không gian trong đường dẫn của cài đặt JDK của bạn.

Cách tốt nhất để giải quyết vấn đề của bạn thực sự đang cài đặt lại JDK thành đường dẫn không gian ít hơn. Tất cả các cách giải quyết khác sẽ khiến bạn đau đầu trong thời gian dài.

+0

Tôi không thể không đồng ý nhiều hơn. Không gian trong đường dẫn là một thực tế của cuộc sống trong Windows, và có một không gian ở vị trí tiêu chuẩn cho các chương trình được cài đặt. Để "nhức đầu" của việc xử lý các không gian quyết định vị trí bạn sử dụng là những gì tôi gọi là "giải pháp thay thế". Học cách xử lý không gian đúng cách là một phần cơ bản của việc sử dụng hệ điều hành và có giá trị hơn rất nhiều trong thời gian dài. Cài đặt các chương trình ở các vị trí không chuẩn chỉ để tránh một khoảng trống trong đường dẫn dẫn đến một hệ thống tập tin không được sắp xếp và cuối cùng tạo ra nhiều * nhức đầu hơn *. Tôi khuyên bạn nên * chống lại * làm điều đó. –

25

Tuy nhiên, giải pháp khác là để làm điều này: C:\Program Files có một cái tên ngắn

C:\Progra~1

trong cửa sổ.

vì vậy chỉ cần viết Progra ~ 1 thay vì Tệp chương trình. {added missing 'r'}

+2

Điều này dường như không còn hoạt động như của Windows 8. –

+0

@MattCraig: có thể được xử lý bằng [giao lộ] (https://technet.microsoft.com/en-us/sysinternals/bb896768.aspx). nơi chúng ta có thể tạo một liên kết tượng trưng như: 'junction c: \ Program-Files" c: \ Program Files "' –

+0

Cảm ơn @adhg, nó hoạt động sau khi cài đặt JAVA_HOME với C: \ Progra ~ 1 thay vì C: \ Program Files \ .. –

2

Đường dẫn bạn đang thiết lập biến môi trường JAVA_HOME trong biến người dùng hay biến hệ thống? Bạn không thể sử dụng biến người dùng trong các biến hệ thống. Vì vậy, nếu JAVA_HOME được định nghĩa là biến người dùng và bạn đang thêm nó vào đường dẫn hệ thống của bạn sẽ không hoạt động.

Từ đầu ra của lệnh thiết lập của bạn, có vẻ như% JAVA_HOME% không được giải quyết. Nó sẽ hiển thị phiên bản mở rộng không phải là phiên bản có% dấu hiệu.

Thêm biến người dùng đường dẫn và thêm% JAVA_HOME% \ bin vào đó. Windows sẽ thêm đường dẫn người dùng của bạn vào cuối đường dẫn hệ thống.

Bạn không cần báo giá trong biến JAVA_HOME ngay cả khi nó chứa dấu cách.

0

chỉ cần thêm cd trước khi thêm vị trí ví dụ: thay vì

C:\Program Files\Java\jdk1.7.0_25

sử dụng

cd C:\Program Files\Java\jdk1.7.0_25

này đã giúp tôi.