Change Ignition Project Location

Is it possible to change where ignition looks for projects? Say for instance could I have my ignition projects stored at c:\projects rather than in the Ignition Programs Files directory.

1 Like

You can change the location of the entire data directory but not just projects.

(change the -Ddata.dir parameter in ignition.conf)

Eh, hang on, that might not be true… looking…

Yeah, okay, try setting -Dignition.projects.dir=/path/to/projects in ignition.conf.

Hey Kevin, can you give me an example of how to format an absolute path with a drive letter?

Something like this should work:

-Dignition.projects.dir="C:/Temp/IgnitionProjects"
1 Like

Great! This worked for me. The reason I’m moving the project directory is so that I don’t need to run as admin to perform git operations. I think it would be better if the default project location wasn’t under Program Files.

We have no intention of moving the project location outside the rest of the Ignition install directory, but you're welcome to change where Ignition gets installed when you run the installer the first time.

I'm not really a Windows person, but it seems like there would be a way to modify permissions on the default projects dir if you need.

If you’re running Windows, another option is to create symbolic links to your desired directory.

With PowerShell you can run New-Item.

Or mklink if you’re on Command Prompt.

Its very un-suggested to change the permissions for c:\program files and c:\program files(x86).
Its like giving anyone access to /root in linux.

I’m suggesting changing it for the data/projects directory, not the install root…

Please i need help !
I would like to change the location of the data directory in partition D on windows
i tried with => wrapper.java.additional.1=-Ddata.dir=“D:\Ignition\data” in igntion.conf file and restart ignition but Don’t work

Try forward slashes:

# Java Additional Parameters
wrapper.java.additional.1=-Ddata.dir="D:/Ignition/data"

any ideas why this doesn't/if this should work with relative paths?

works fine at the gateway level, but Designer fails to save with

com.inductiveautomation.ignition.client.gateway_interface.GatewayException: Unable to push project changes

com.inductiveautomation.ignition.client.gateway_interface.GatewayException: Unable to push project changes.
at com.inductiveautomation.ignition.client.gateway_interface.GatewayInterface.newGatewayException(GatewayInterface.java:351)
at com.inductiveautomation.ignition.client.gateway_interface.GatewayInterface.sendMessage(GatewayInterface.java:325)
at com.inductiveautomation.ignition.client.gateway_interface.GatewayInterface.sendMessage(GatewayInterface.java:278)
at com.inductiveautomation.ignition.client.gateway_interface.GatewayInterface.invoke(GatewayInterface.java:954)
at com.inductiveautomation.ignition.client.gateway_interface.GatewayInterface.pushProject(GatewayInterface.java:987)
at com.inductiveautomation.ignition.designer.project.PushTask.run(PushTask.java:19)
at com.inductiveautomation.ignition.client.util.gui.ProgressDialog$TaskRunner.run(ProgressDialog.java:364)
at java.base/java.lang.Thread.run(Unknown Source)
Caused by: com.inductiveautomation.ignition.gateway.servlets.gateway.functions.GatewayFunctionException: Unable to push project changes.
at com.inductiveautomation.ignition.gateway.servlets.gateway.functions.Projects.push(Projects.java:248)
at jdk.internal.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
at jdk.internal.reflect.NativeMethodAccessorImpl.invoke(null)
at jdk.internal.reflect.DelegatingMethodAccessorImpl.invoke(null)
at java.lang.reflect.Method.invoke(null)
at com.inductiveautomation.ignition.gateway.servlets.gateway.AbstractGatewayFunction.invoke(AbstractGatewayFunction.java:228)
at com.inductiveautomation.ignition.gateway.servlets.Gateway.doPost(Gateway.java:431)
at javax.servlet.http.HttpServlet.service(HttpServlet.java:707)
at javax.servlet.http.HttpServlet.service(HttpServlet.java:790)
at com.inductiveautomation.ignition.gateway.bootstrap.MapServlet.service(MapServlet.java:86)
at org.eclipse.jetty.servlet.ServletHolder$NotAsync.service(ServletHolder.java:1450)
at org.eclipse.jetty.servlet.ServletHolder.handle(ServletHolder.java:799)
at org.eclipse.jetty.servlet.ServletHandler$ChainEnd.doFilter(ServletHandler.java:1631)
at org.eclipse.jetty.servlet.ServletHandler.doHandle(ServletHandler.java:548)
at org.eclipse.jetty.server.handler.ScopedHandler.handle(ScopedHandler.java:143)
at org.eclipse.jetty.security.SecurityHandler.handle(SecurityHandler.java:600)
at org.eclipse.jetty.server.handler.HandlerWrapper.handle(HandlerWrapper.java:127)
at org.eclipse.jetty.server.handler.ScopedHandler.nextHandle(ScopedHandler.java:235)
at org.eclipse.jetty.server.session.SessionHandler.doHandle(SessionHandler.java:1624)
at org.eclipse.jetty.server.handler.ScopedHandler.nextHandle(ScopedHandler.java:233)
at org.eclipse.jetty.server.handler.ContextHandler.doHandle(ContextHandler.java:1440)
at org.eclipse.jetty.server.handler.ScopedHandler.nextScope(ScopedHandler.java:188)
at org.eclipse.jetty.servlet.ServletHandler.doScope(ServletHandler.java:501)
at org.eclipse.jetty.server.session.SessionHandler.doScope(SessionHandler.java:1594)
at org.eclipse.jetty.server.handler.ScopedHandler.nextScope(ScopedHandler.java:186)
at org.eclipse.jetty.server.handler.ContextHandler.doScope(ContextHandler.java:1355)
at org.eclipse.jetty.server.handler.ScopedHandler.handle(ScopedHandler.java:141)
at org.eclipse.jetty.server.handler.HandlerWrapper.handle(HandlerWrapper.java:127)
at com.inductiveautomation.catapult.handlers.RemoteHostNameLookupHandler.handle(RemoteHostNameLookupHandler.java:121)
at org.eclipse.jetty.server.handler.HandlerWrapper.handle(HandlerWrapper.java:127)
at org.eclipse.jetty.rewrite.handler.RewriteHandler.handle(RewriteHandler.java:322)
at org.eclipse.jetty.server.handler.HandlerList.handle(HandlerList.java:59)
at org.eclipse.jetty.server.handler.HandlerCollection.handle(HandlerCollection.java:146)
at org.eclipse.jetty.server.handler.HandlerWrapper.handle(HandlerWrapper.java:127)
at org.eclipse.jetty.server.Server.handle(Server.java:516)
at org.eclipse.jetty.server.HttpChannel.lambda$handle$1(HttpChannel.java:487)
at org.eclipse.jetty.server.HttpChannel.dispatch(HttpChannel.java:732)
at org.eclipse.jetty.server.HttpChannel.handle(HttpChannel.java:479)
at org.eclipse.jetty.server.HttpConnection.onFillable(HttpConnection.java:277)
at org.eclipse.jetty.io.AbstractConnection$ReadCallback.succeeded(AbstractConnection.java:311)
at org.eclipse.jetty.io.FillInterest.fillable(FillInterest.java:105)
at org.eclipse.jetty.io.ChannelEndPoint$1.run(ChannelEndPoint.java:104)
at org.eclipse.jetty.util.thread.strategy.EatWhatYouKill.runTask(EatWhatYouKill.java:338)
at org.eclipse.jetty.util.thread.strategy.EatWhatYouKill.doProduce(EatWhatYouKill.java:315)
at org.eclipse.jetty.util.thread.strategy.EatWhatYouKill.tryProduce(EatWhatYouKill.java:173)
at org.eclipse.jetty.util.thread.strategy.EatWhatYouKill.run(EatWhatYouKill.java:131)
at org.eclipse.jetty.util.thread.ReservedThreadExecutor$ReservedThread.run(ReservedThreadExecutor.java:409)
at org.eclipse.jetty.util.thread.QueuedThreadPool.runJob(QueuedThreadPool.java:883)
at org.eclipse.jetty.util.thread.QueuedThreadPool$Runner.run(QueuedThreadPool.java:1034)
at java.lang.Thread.run(null)

Ignition v8.1.21 (b2022092908)
Java: Azul Systems, Inc. 11.0.15

Is there a corresponding error in the Gateway logs?

there is not (default logging)

tried:
wrapper.java.additional.3=-Dignition.projects.dir=../projects
wrapper.java.additional.3=-Dignition.projects.dir=..\\projects
wrapper.java.additional.3=-Dignition.projects.dir=..\projects

(windows host)

Well, I don't really expect relative paths to work, so just don’t do that.

I'm a bit surprised at that response - use case is a container-less/portable, submoduled (version controlled) dev environment FWIW, but I guess we'll roll with it - thanks for confirmation!

Hmm, after looking I'm a bit unsure what to expect now.

The code I was thinking of does expect absolute paths, but it looks like when you set that property we attempt to convert it to an absolute path before passing it to the code that expects absolute paths...

Does the directory you're to resolve exist? Is there a warning from IgnitionProjectManager on startup about it?

directory exists, gateway (and designer) load projects fine, issue is only on save.

INFO   | jvm 1    | 2024/02/14 09:13:56 | I [g.ProjectManager              ] [15:13:56]: Using custom projects dir: ..\projects 
INFO   | jvm 1    | 2024/02/14 09:13:56 | I [g.ProjectManager              ] [15:13:56]: Using custom projects dir: ..\projects